1. 程式人生 > 其它 >通過例子體現泛型擦除特性

通過例子體現泛型擦除特性

通過Spring拷貝方法演示

1、演示程式碼

定義了公用的泛型拷貝物件(源物件和目標物件),裡面包含list的泛型屬性;

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

class CopyObj<T> {
    private List<T> list;

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        
this.list = list; } } /** * @author Green * @date 2021年12月31日 11:11 上午 */ public class CopyTest { public static void main(String[] args) { // 定義包含List<String>屬性的源物件 CopyObj<String> strCopyObj = new CopyObj<>(); List<String> stringList = new ArrayList<>(); stringList.add(
"abc1"); stringList.add("abc2"); stringList.add("abc3"); strCopyObj.setList(stringList); // 定義包含List<Integer>屬性的目標物件 CopyObj<Integer> intCopyObj = new CopyObj<>(); List<Integer> integerList = new ArrayList<>(); intCopyObj.setList(integerList);
// 通過spring拷貝物件,只要屬性名和屬性型別能夠對應上都會進行拷貝 // 執行時泛型擦除了,所以泛型對不上並不影響 // 兩個物件中都包含名為list 型別為java.util.List 的屬性,所以這兩個屬性會進行拷貝 // 但是拷貝之後目標物件intCopyObj中儲存的是源物件strCopyObj中屬性list的值, // 也就是講string型別的值拷貝到了intCopyObj物件中的List<Integer>類中屬性中 // 拷貝可成功,因為泛型擦除,實際拷貝進的屬性型別是List BeanUtils.copyProperties(strCopyObj, intCopyObj); // 這裡是拷貝 // 但是這裡遍歷會出問題,因為編譯時會檢測泛型, // 要想編譯通過,目標物件的屬性編譯時是Integer型別,但實際執行是這裡儲存的是String型別 // 所以這裡遍歷會報錯型別轉換異常 for (Integer integer : intCopyObj.getList()) { System.out.println("success!"); } } }

2、debug詳情

拷貝是可以完成的,目標物件intCopyObj中屬性List<Integer> 會儲存三個String型別的值,如下:

但是下一步遍歷的時候會報錯,String不能轉換為Integer,如下圖:

原因:這就是因為泛型在編譯期有效,在執行期擦除了,可以通過反射賦值而不受泛型限制,但是後面的呼叫執行期會報錯;具體原因可以看第一部分的程式碼註釋;

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian
TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 帶著疑問去思考,然後串聯,進而歸納總結,不斷追問自己,進行自我辯證,像偵查嫌疑案件一樣看待技術問題,漆黑的街道,你我一起尋找線索,你就是技術界大偵探福爾摩斯