以下代码示例编译但带有编译器警告
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");
}
}
当我编译上面的内容时,我收到以下警告
Note: ZiggyTest2.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
或者如果我使用-Xlint编译它:未选中我收到以下警告
ZiggyTest2.java:12: warning: [unchecked] unchecked conversion
found : SubArrayList<Animal>
required: java.util.ArrayList<Animal>
ArrayList<Animal> nums = new SubArrayList<Animal>();
^
1 warning
如果我将nums的初始化更改为
List<Animal> nums = new ArrayList<Animal>();
那时我没有得到任何警告。
他们为什么表现不同。 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");
}
}
我认为只有在将通用代码与非通用代码混合时才会出现编译器警告。
答案 0 :(得分:6)
您的SubArrayList<T>
课程仅展开ArrayList
(主要是ArrayList<?>
),而不是ArrayList<T>
,从SubArrayList<T>
到ArrayList<T>
的演员表未经检查
如果您将其更改为class SubArrayList<T> extends ArrayList<T> {}
,则不会再出现问题:)
答案 1 :(得分:3)
在
中添加<T>
到ArrayList
class SubArrayList<T> extends ArrayList<T>{}
答案 2 :(得分:2)
List
是一个接口,而不是一个类。 ArrayList不是List的子类,只是一个实现List接口的类。但是,SubArrayList是ArrayList的子类。