テストの理由
一般的な消去機構の研究では、そこにいくつかの混乱があるので、自分の学習の内容が正しいことを確認するために、いくつかの実験をしました。
テスト1
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
for (Object o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
出力
true
list1:
java.lang.String
java.lang.String
java.lang.Integer
list2:
java.lang.Integer
java.lang.String
java.lang.Integer
[23, 1234, 123]--[123, 1234, 123]
テスト2
再びテストした、ときにオブジェクトタイプが削除されていない場合
package generics;
import java.util.ArrayList;
import java.util.List;
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
//类型变化
for (String o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
輸出
true
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
list1:
at generics.ErasedTypeEquivalence.main(ErasedTypeEquivalence.java:28)
java.lang.String
java.lang.String
テスト3
package generics;
import java.util.ArrayList;
import java.util.List;
public class ErasedTypeEquivalence {
private void setList(List list){
list.add("1234");
list.add(123);
}
public static void main(String[] args){
//两个类型相同
Class c1=new ArrayList<String>().getClass();
Class c2=new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
List<String> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
list1.add("23");
//以下代码编译不通过
// list1.add(123);
list2.add(123);
// list2.add("123");
ErasedTypeEquivalence erasedTypeEquivalence=new ErasedTypeEquivalence();
erasedTypeEquivalence.setList(list1);
erasedTypeEquivalence.setList(list2);
System.out.println("list1:");
//类型变化
for (Integer o:list1){
System.out.println(o.getClass().getName());
}
System.out.println("list2:");
for (Object o:list2){
System.out.println(o.getClass().getName());
}
System.out.println(list1+"--"+list2);
}
}
結果:コンパイラが通りません
結論
一般的な機能の方法でジェネリックの使用のみをチェックするために、ことがわかります。
ジェネリックはないが、コンパイル後に消去を取得し、内部ArraryListで入ってくるObject型に置き換えられています。
参考:「Javaプログラミングのアイデア」