Class java.util.Iterator as it is defined in Java SE version 1.4:
public interface Iterator {
boolean hasNext();
Object next();
void remove();
}
Class java.util.Iterator as it is defined in Java SE version 5.0:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
有人提到,通过擦除实现泛型会导致一些恼人的限制(例如没有 new T[42])。还有人提到,这样做的主要原因是字节码的向后兼容性。这(大多数情况下)也是正确的。所生成的字节码-目标1.5与去糖类型化-目标1.4有些不同。从技术上讲,甚至有可能(通过巨大的技巧)获得对泛型类型实例化 在运行时的访问,证明字节码中确实存在某些东西。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GenericsErasure {
public static void main(String args[]) {
List<String> list = new ArrayList<String>();
list.add("Hello");
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
String s = iter.next();
System.out.println(s);
}
}
}
如果你编译这段代码,然后用 Java 反编译器反编译它,你会得到这样的东西
import java.io.PrintStream;
import java.util.*;
public class GenericsErasure
{
public GenericsErasure()
{
}
public static void main(String args[])
{
List list = new ArrayList();
list.add("Hello");
String s;
for(Iterator iter = list.iterator(); iter.hasNext(); System.out.println(s))
s = (String)iter.next();
}
}