關於Java反射給泛型集合賦值問題

泛型

Java泛型簡單描述下:

比如創建一個List集合,我想在裡邊隻放Student對象信息,就需要寫成

List<Student> studentList = new ArrayList();

這個時候List裡面就隻能放入Student類型的值,如果強行放入其他類型(比如說Integer)的就會提示錯誤信息:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

按照這個結果來看,studentList裡面就隻能放入Student類型的值,沒有什麼問題。

然後,奇怪的事情發生瞭,在公司項目的log裡發現瞭一個error:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

原代碼類似於:

Student student = studentList.get(0);

What? 集合創建的時候明明給的泛型是Student啊,這個String是哪蹦出來的。

這個時候又得提出一個概念:

反射

比較全面的解釋:

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
要想解剖一個類,必須先要獲取到該類的字節碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節碼文件對應的Class類型的對象.

一通debug,我發現瞭這麼一段代碼(來自於hutools包內的某個方法中,詳細是哪個記不太清瞭,模仿著寫寫):

    Class<? extends List> aClass = list.getClass();
        Method method = aClass.getMethod("add", Object.class);
        for (Object o : arg) {
            method.invoke(list, o);
        }
        return list;
    }

差不多就這樣子,入參是[1,2,3,4]和studentList,在外邊取list中的值時,發現:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.entity.Student

這玩意,利用反射獲取瞭List的add方法,值類型也不判斷,直接給塞進集合裡瞭。。。。

其實剛開始碰到時,一臉懵的,耗費瞭很長時間取排查問題,我泛型Student的List,怎麼會出現這種問題,從List中取出來的值不能轉換成Student。。。。

不過後來發現原因之後,感覺其實也不復雜,挺簡單的,還是經驗太少,判斷錯誤能力不行,共勉。

上面的代碼用的Student類和String、Integer代替,公司內部代碼就不透露瞭。

到此這篇關於Java反射給泛型集合賦值的文章就介紹到這瞭,更多相關Java反射給泛型集合賦值內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: