我对 Java 中的泛型编程有疑问。
当 C++ 编译器在代码中找到对泛型函数/对象(模板)的引用时,它会创建一个使用非泛型(具体)类型的函数(对于它遇到的任何类型)。
我不知道它在 Java 中是如何工作的。javac 的行为是否与 C++ 编译器相同?还是在运行时由 JVM 管理?
谢谢
Java 中的泛型纯粹是一个编译时构造,以确保类型安全——它们被编译器擦除并替换为原始等效项(但保证安全,除非您专门强制转换为 void 该类型安全。)
这是实现泛型的一种相对简洁的方式,因为不需要对 VM 或热点进行修改 - 只需编译器。除了在运行时没有可用的泛型类型信息这一明显限制外,它偶尔也会造成“无泛型”实例也必须有意义的限制。例如,如果我想做类似的事情:
public class CompareMe implements Comparator<Thing>, Comparator<OtherThing> {
public int compareTo(Thing other) {
//Blah
}
public int compareTo(OtherThing other) {
//Blah
}
}
...那么使用这种形式是不可能的,因为直接的无泛型等效项是:
public class CompareMe implements Comparator, Comparator {
public int compareTo(Object other) {
//Blah
}
public int compareTo(Object other) {
//Blah
}
}
......显然那里存在名称冲突的问题!当然,这可以使用单个比较器重写,或者使用带有自定义比较器的 compareTo 方法,但值得注意。
Java 在编译之前为转换类型生成代码。java也使用类型推断来获得正确的类型。例如 :
List <Integer> mylist = new ArrayList<Integer>();
i.add(someInt);
在旧样式中,您可以手动转换类型:
Integer valI = (Integer)mylist.get(index);
今天编译器“知道”类型元素mylist
并(Integer)
自行添加。结果你只写它:
Integer valI = mylist.get(index);