泛型擦除和遗留代码

时间:2009-07-23 11:27:16

标签: java generics

在许多书中都说Java的通用使用擦除的原因是 与遗留代码兼容。

好的,非常好,但任何人都可以向我展示一些简单的例子 通用代码与旧的遗留代码交互,反之亦然?

4 个答案:

答案 0 :(得分:3)

与遗留代码兼容意味着它应该能够在没有编译的情况下在新版本的JVM上运行。假设你有一些没有源代码的遗留库。这可以确保您能够在Java 5上运行它。您的新代码将能够毫无问题地调用遗留代码。

答案 1 :(得分:3)

这是一个在没有类型擦除的情况下无法实现的示例:

public static void main(String[] args) {
    List<String> newList = legacyMethod();

    for (String s : newList) {
        System.out.println(s);
    }
}

public static List legacyMethod() {
    List oldList = new ArrayList();
    oldList.add("a");
    oldList.add("b");
    oldList.add("c");
    return oldList;
}

答案 2 :(得分:1)

在当前的JRE上运行旧代码,List之类的代码将使用new代码。方法很糟糕,Collections.sort将是新代码回调旧代码。

答案 3 :(得分:0)

获取尚未移植到Java 5的任何旧Java库。你会发现很多旧代码返回或接受List的地方。没有擦除,你就不能在你的代码中使用泛型(为了让你的生活变得更简单)并将你的列表作为参数传递给框架而不用(浅)复制整个事物 - ListList<String>StringFile不同。

以类似的方式,当库返回一个列表时,你必须使用带有迭代器的pre-5语法来处理它,或者将基本列表复制到一个列表中。

有办法解决这个问题。太阳本可以使List等于List<Object>或者,上帝保佑,List<?>。但这会引入更微妙的问题。所以他们决定采用阻力最小的方式,并在编译过程中使用通用信息(主要是)。