-4

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

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

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

谢谢

4

2 回答 2

3

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 方法,但值得注意。

于 2013-10-31T13:04:25.717 回答
0

Java 在编译之前为转换类型生成代码。java也使用类型推断来获得正确的类型。例如 :

List <Integer> mylist = new ArrayList<Integer>();
i.add(someInt);

在旧样式中,您可以手动转换类型:

Integer valI = (Integer)mylist.get(index);

今天编译器“知道”类型元素mylist(Integer)自行添加。结果你只写它:

Integer valI = mylist.get(index);
于 2013-10-31T13:11:29.807 回答