import java.util.ArrayList;
public class Fanxing {
public static void main(String[] args) throws Exception{
ArrayList<Integer> arrayList3=new ArrayList<Integer>();
arrayList3.add(1);//這樣調用add方法只能存儲整形,因為泛型類型的實例為Integer
arrayList3.getClass().getMethod("add", Object.class).invoke(arrayList3, "asd");
for (int i=0;i<arrayList3.size();i++) {
System.out.println(arrayList3.get(i));
}
ArrayList<String> arrayList2=new ArrayList<String>();
arrayList2.add("asd");//這樣調用add方法只能
存儲整形,因為泛型類型的實例為Integer
arrayList2.getClass().getMethod("add", Object.class).invoke(arrayList2, 1);
for (int i=0;i<arrayList2.size();i++) {
System.out.println(arrayList2.get(i));
}
}
}
輸出結果為:
1
asd
asd
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at Fanxing.main(Fanxing.java:19)
請問這是什麼問題?
我運行了下, 找到原因了, 原因是System.out.println() 造成的。
這個方法可傳的參數為基礎類型和Object對象,還提供了一個String對象的方法參數。
第一個例子中List是Integer泛型,System.out.println() 是沒有提供對應的方法參數, 所以會調用Object參數的方法,Integer轉Object是沒問題的,所以通過了。
第二個例子中List是String泛型,System.out.println() 提供了String參數的就去,所以用的是以String為參數的方法,但是list中的第2個值你用了反射傳的是個數值,這裡會做個強轉,從Integer轉成String,所以出錯。