【问题标题】:How java threats generics programming? [duplicate]java如何威胁泛型编程? [复制]
【发布时间】:2013-10-31 22:43:05
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: java generics


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多