次のコード例はコンパイルされますが、コンパイラの警告が表示されます
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");
}
}
ジェネリック コードと非ジェネリック コードを混在させた場合にのみ、コンパイラの警告が表示されると思いました。