Java泛型,来自C++模板

Fra*_*ank 1 java generics

我在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
Run Code Online (Sandbox Code Playgroud)

我不太了解"isAssignableFrom"的细节.当然,我希望编译器停止l3 = l2,但它似乎与前一行相矛盾?(我确定这里有微妙的要点,这就是我所追求的:-)

cor*_*iKa 8

<Blah>编译后,所有信息都被删除了.就字节码而言,它们都属于同一类.

在编译期间,我们会检查它们的一致性和兼容性.

因此,当它检查l2.getClass().isAssignableFrom(l1.getClass())它的说法is ArrayList assignable from ArrayList?,答案是肯定的.但是因为在编译期间它仍然有类型信息,所以不允许.

  • 具体来说,这称为*类型擦除*.关于泛型的Java教程非常擅长解释Java泛型的缺陷:http://download.oracle.com/javase/tutorial/java/generics/erasure.html (2认同)