【发布时间】:2011-12-07 14:03:01
【问题描述】:
以下代码示例可以编译,但会出现编译器警告
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:unchecked 编译它,我会收到以下警告
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");
}
}
我认为只有将泛型代码与非泛型代码混合时才会出现编译器警告。
【问题讨论】:
-
感谢大家的回复。