2

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

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");
    }
}

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

4

3 回答 3

6

您的SubArrayList<T>课程仅扩展ArrayList(本质上ArrayList<?>),而不是ArrayList<T>从未选中SubArrayList<T>进行强制转换。ArrayList<T>

如果您将其更改为class SubArrayList<T> extends ArrayList<T> {},您将不再有问题:)

于 2011-12-07T14:07:07.077 回答
3

将 a 添加<T>到您的 ArrayList 中

class SubArrayList<T> extends ArrayList<T>{}
于 2011-12-07T14:06:36.743 回答
2

List是一个接口,而不是一个类。ArrayList 不是 List 的子类,只是一个实现 List 接口的类。然而,SubArrayList 是 ArrayList 的子类。

于 2011-12-07T14:06:12.417 回答