【问题标题】:Java Generics - Why is this method call considered an unchecked conversionJava 泛型 - 为什么此方法调用被视为未经检查的转换
【发布时间】: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");
    }
}

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

【问题讨论】:

  • 感谢大家的回复。

标签: java generics scjp ocpjp


【解决方案1】:

您的SubArrayList&lt;T&gt; 类仅扩展ArrayList(本质上是ArrayList&lt;?&gt;),而不是ArrayList&lt;T&gt;,将SubArrayList&lt;T&gt; 转换为ArrayList&lt;T&gt; 未选中。

如果你把它改成class SubArrayList&lt;T&gt; extends ArrayList&lt;T&gt; {},你就不会再有问题了:)

【讨论】:

    【解决方案2】:

    &lt;T&gt; 添加到您的 ArrayList 中,如

    class SubArrayList<T> extends ArrayList<T>{}
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多