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<?>)のみを拡張し、からunchecked へArrayList<T>のキャストを行いません。SubArrayList<T>ArrayList<T>

に変更するとclass SubArrayList<T> extends ArrayList<T> {}、もう問題はありません:)

于 2011-12-07T14:07:07.077 に答える
3

<T>次のように ArrayListに a を追加します

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 に答える