通過例子體現泛型擦除特性
阿新 • • 發佈:2021-12-31
通過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 TRANSLATE with EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back 帶著疑問去思考,然後串聯,進而歸納總結,不斷追問自己,進行自我辯證,像偵查嫌疑案件一樣看待技術問題,漆黑的街道,你我一起尋找線索,你就是技術界大偵探福爾摩斯