2009-07-23 85 views
1

在许多书中说,之所以其Java的泛型使用擦除是 有遗留代码的兼容性。泛型擦除和遗留代码

好,很好,但任何人都可以给我一些简单的例子,其中一些 通用的代码与旧的遗留代码,反之亦然互动?

回答

3

这里有没有类型擦除这是不可能的例子:在当前JRE和List喜欢的用途

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; 
} 
+0

这不是一个很好的例子,在旧的和新的方法相同。 – 2009-07-23 11:41:13

3

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

1

运行旧代码将使用新老代码。方法吸如Collections.sort将是新回调的旧代码。

0

采取哪些还没有被移植到Java 5的任何旧的Java库,但。您会发现很多旧代码返回或接受的地方List。如果不删除,你不能使用泛型的代码(让你的生活更简单),并通过您的列表作为参数传递给框架无(浅)复制了整个事情 - ListList<String>会为StringFile不同。

以类似的方式,当库返回一个列表,你要么必须使用预5语法与迭代器来处理它或复制的基本清单到泛型一个。

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