arrays.aslist添加派生类java

1 java arrays list version

所以我有这个:

class A{}
class B extends A {}
class C extends B {
    public String toString(){ return new String("C"); } 
    }
class D extends B {
    public String toString(){ return "D"; } 
    }
Run Code Online (Sandbox Code Playgroud)

然后在主要

List<A> list = Arrays.asList(new C(), new D());
        for (A a : list) {
            System.out.println(a.toString());
        }
Run Code Online (Sandbox Code Playgroud)

我可以编译这段代码并打印出来:C D但在我朋友的电脑上却无法编译.它必须处理我正在使用的Java版本?

Sot*_*lis 5

那就对了.当您的朋友使用Java 7时,您必须在Java 8上进行编译.

在Java 7中,List返回的类型

Arrays.asList(new C(), new D());
Run Code Online (Sandbox Code Playgroud)

将推断为aList<B>a List<B>不能分配给aList<A>.

在Java 8中,通过一些更智能的泛型,编译器会推断出同一表达式的不同类型,List<A>.

您可以使用显式类型参数更正Java 7版本

Arrays.<A>asList(new C(), new D());
Run Code Online (Sandbox Code Playgroud)