Java Generics - 为什么此方法调用被视为未经检查的转换

zig*_*ggy 2 java generics scjp ocpjp

以下代码示例编译但带有编译器警告

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class SubArrayList<T> extends ArrayList{}

class ZiggyTest2{

    public static void main(String[] args){                 
        ArrayList<Animal> nums = new SubArrayList<Animal>();

    }

    public static void testMethod(ArrayList<Animal> anim){
        System.out.println("In TestMethod");
    }
}   
Run Code Online (Sandbox Code Playgroud)

当我编译以上时,我得到以下警告

Note: ZiggyTest2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Run Code Online (Sandbox Code Playgroud)

或者,如果我使用-Xlint编译它:未选中我收到以下警告

ZiggyTest2.java:12: warning: [unchecked] unchecked conversion
found   : SubArrayList<Animal>
required: java.util.ArrayList<Animal>
                ArrayList<Animal> nums = new SubArrayList<Animal>();
                                         ^
1 warning
Run Code Online (Sandbox Code Playgroud)

如果我将nums的初始化更改为

List<Animal> nums = new ArrayList<Animal>(); 
Run Code Online (Sandbox Code Playgroud)

然后我没有得到任何警告.

他们为什么表现不同.ArrayList是List的子类型,SubArrayList是ArrayList的子类型,所以我期望实例化是相同的.

谢谢.

编辑

此外,如果我调用该方法并将其传递给一般初始化的引用,它也会产生警告.

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

class SubArrayList<T> extends ArrayList{}

class ZiggyTest2{

    public static void main(String[] args){                 
        SubArrayList<Animal> nums = new SubArrayList<Animal>();
        testMethod(nums);

    }

    public static void testMethod(ArrayList<Animal> anim){
        System.out.println("In TestMethod");
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为只有在将通用代码与非通用代码混合时才会出现编译器警告.

Rom*_*ain 6

你的SubArrayList<T>类只扩展ArrayList(基本ArrayList<?>),而不是ArrayList<T>从制造铸造SubArrayList<T>ArrayList<T>选中.

如果你改成它class SubArrayList<T> extends ArrayList<T> {},你将不会有问题:)