我对Java中的泛型编程存有疑问。
当C ++编译器在代码中找到对泛型函数/对象(模板)的引用时,它会创建一个使用非泛型(具体)类型的函数(对于它遇到的任何类型)。
我不知道它在Java中是如何工作的。 javac行为与C ++编译器相同?或者它在运行时由JVM管理?
谢谢
答案 0 :(得分:3)
Java中的泛型纯粹是一个编译时构造,以确保类型安全 - 它们被编译器擦除并被原始等价物替换(但保证安全,除非你特别设法使类型安全无效。)
这是一种相对简洁的实现泛型的方法,因为不需要对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方法和传入的自定义比较器重写,但值得注意。
答案 1 :(得分:0)
Java在编译之前为转换类型生成代码。此外,java使用type inference来获取正确的类型。例如:
List <Integer> mylist = new ArrayList<Integer>();
i.add(someInt);
在旧式中,您可以手动转换类型:
Integer valI = (Integer)mylist.get(index);
今天编译器“知道”mylist
的类型元素并自行添加(Integer)
。结果你只写它:
Integer valI = mylist.get(index);