在许多书中都说Java的通用使用擦除的原因是 与遗留代码兼容。
好的,非常好,但任何人都可以向我展示一些简单的例子 通用代码与旧的遗留代码交互,反之亦然?
答案 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
的地方。没有擦除,你就不能在你的代码中使用泛型(为了让你的生活变得更简单)并将你的列表作为参数传递给框架而不用(浅)复制整个事物 - List
和List<String>
与String
和File
不同。
以类似的方式,当库返回一个列表时,你必须使用带有迭代器的pre-5语法来处理它,或者将基本列表复制到一个列表中。
有办法解决这个问题。太阳本可以使List
等于List<Object>
或者,上帝保佑,List<?>
。但这会引入更微妙的问题。所以他们决定采用阻力最小的方式,并在编译过程中使用通用信息(主要是)。