前言

今天面试问到的int类型的数字,在不转型的前提下怎么放入List其实,这道题考验的面试者对于java泛型的理解,java泛型的实现采取了“伪泛型”的策略。

类型擦除(Type Erasure)

Java在语法上支持泛型,但是编译阶段会进行“类型擦除(Type Erasure),将所有泛型标识(尖括号中的内容)都替换为 原生态类型

原生态类型(Raw Type)

每个泛型都会定义一个原生态类型(Raw Type),即不带任何实际类型参数的泛型名称。例如,List对应的原生态类型是List,Set对应的原生态类型是Set

解题:

所以,针对这个面试题,我们可以使用一个临时变量,将List转为他的原生态类型List,这样就可以实现int类型存入。

List<String> list = new ArrayList<>()// 临时变量,将泛型变成原生态类型List temp = list;temp.add(1);list.add("abc");
System.out.println(temp);

这只是面试的解答,真实编程不建议这么做,因为:尽早的发现错误,最好是编译期! 

其实还有一种实现方式,可以提供参考,如下图

image.png

欢迎大家一起讨论

总结

Java泛型的实现确实采用了所谓的“伪泛型”(Pseudo-Generics)策略。

这是因为在Java 5之前,泛型并没有被真正实现,而是通过类型擦除(Type Erasure)来实现的。

类型擦除是Java泛型实现的核心机制。在编译期间,所有的泛型信息,包括类型参数和类型引用,都会被擦除。这意味着在运行时,Java虚拟机(JVM)无法获取泛型信息。

因此,Java运行时环境无法对泛型类型进行任何操作,如类型检查或类型转换。这种实现策略有其优点和缺点。

优点是它使得泛型代码与非泛型代码在行为上一致,因此不需要修改现有的代码库。此外,由于泛型信息在运行时被擦除,因此不会增加运行时开销。

然而,缺点是Java泛型在运行时失去了类型信息,这使得某些操作(如反射或序列化)变得复杂或不可能。尽管Java泛型的实现策略被称为“伪泛型”,但这种策略仍然是有效的,并且广泛应用于Java开发中。通过这种方式,Java提供了一种灵活且类型安全的机制来处理数据类型,而无需改变已有的代码库和运行时环境。