Java小白踩坑录 - 使用类型擦除来实现伪泛型

简介: Java小白踩坑录 - 使用类型擦除来实现伪泛型

image.png


小 P:” 是这样的,之前我们有个接口,是返回用户的各项评分,这个接口已经上线半年了,但客户要求我们不但要返回用户的各项评分,还要将描述一下分数的意义。“


小 P:” 原来接口是这样的 List<Integer> getScoresByUser(UserInfo uinfo),返回 60、1500、90 这样的得分,现在该接口要返回 60,活跃度中等【0~100】、1500、粉丝数、90,好评度【0-100】“。


小白:” 不是可以新加一个接口给对方吗?“



寻找解决方案

沟通完成后,小白拖着郁闷的身心,拉下新项目的代码,想着解决方案。先整理思路:

原先的接口原型:


public static void main(String[] args) {
     ArrayList<Integer> list = new  ArrayList<>();
        //todo ,get hot socore
        list.add(60); 
        //todo get fans
        list.add(1500);
        //todo get evaluation
        list.add(90);
        System.out.println(Arrays.toString(list.toArray()));
}

打印出结果:

[60, 1500, 90]

新接口想要打印出:

[60,活跃度中等【0~100】,1500,粉丝数,90,好评度【0-100】]

小白一直想吼出,老子不干了!

public static void main(String[] args) {
    ArrayList<Integer> list = new   ArrayList<>();          
     list.add(2);
     list.add(3);
     try {
     //todo ,get hot socore
     list.add(60); 
     list.getClass().getMethod("add", Object.class).invoke(list, "活跃度中等【0~100】");
             //todo get fans
     list.add(1500);
     list.getClass().getMethod("add", Object.class).invoke(list, "粉丝数,排名 3689 位");
     //todo get evaluation
     list.add(90);  
     list.getClass().getMethod("add", Object.class).invoke(list, "用户评价,超越 92%的用户");
     } catch (Exception e) {
     e.printStackTrace();
     }
     System.out.println(Arrays.toString(list.toArray()));
}
// 输出
// [60,活跃度中等【0~100】,1500,粉丝数,90,好评度【0-100】]

原来因为种种原因,Java 不能实现真正的泛型,只能使用类型擦除来实现伪泛型。


类型擦除


当编译器对带有泛型的 Java 代码进行编译时,它会去执行类型检查和类型推断,然后生成普通的不带泛型的字节码,这种字节码可以被一般的 Java 虚拟机接收并执行,这种技术被称为擦除(erasure)。这样虽然不会有类型膨胀问题,但是也引起来许多新问题,所以,SUN 对这些问题做出了种种限制,避免我们发生各种错误。


编译器可以在对源程序(带有泛型的 Java 代码)进行编译时使用泛型类型信息保证类型安全,对大量如果没有泛型就不会去验证的类型安全约束进行验证,同时在生成的字节码当中,将这些类型信息清除掉。


目录
相关文章
|
1月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
1月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
49 2
|
1月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
37 2
|
2月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
30 0
[Java]泛型
|
2月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
217 5
|
2月前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
190 7
|
2月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
16 1
|
2月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
2月前
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
313 9
|
2月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
27 5