我发现以下 Java 代码非常出色:
ArrayList<String> l1 = new ArrayList<String>();
ArrayList<Integer> l2 = new ArrayList<Integer>();
System.out.println(l1.getClass() == l2.getClass()); // true
System.out.println(l2.getClass().isAssignableFrom(l1.getClass())); // true too
//ArrayList<Integer> l3 = l1; // won't compile though
我不太明白“isAssignableFrom”的细节。当然,我希望编译器停止l3 = l2,但这似乎与上一行矛盾? (我敢肯定这里有一些微妙的地方,这就是我所追求的:-)
最佳答案
所有 <Blah>
信息在编译时间后被剥离。就字节码而言,它们都是同一个类。
在编译过程中,会检查它们的一致性和兼容性。
所以当它检查 l2.getClass().isAssignableFrom(l1.getClass())
时它在说 is ArrayList assignable from ArrayList?
答案是肯定的。但是因为在编译过程中它仍然有类型信息,所以这是不允许的。
关于Java 泛型,来自 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451127/