java威胁泛型编程如何?

时间:2013-10-31 12:46:04

标签: java generics

我对Java中的泛型编程存有疑问。

当C ++编译器在代码中找到对泛型函数/对象(模板)的引用时,它会创建一个使用非泛型(具体)类型的函数(对于它遇到的任何类型)。

我不知道它在Java中是如何工作的。 javac行为与C ++编译器相同?或者它在运行时由JVM管理?

谢谢

2 个答案:

答案 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);