1.很多人對泛型一知半解。侷限於jdk的集合類。2.他們總想在泛型內部獲得真實型別。
3.他們甚至不知道泛型擦除。
1.泛型**在編譯時經行泛型擦除。list和 list
在編譯後是一樣的位元組碼。此處使用泛型的意義在於:使用編譯器確保型別的正確性。
list
<
string
>
list
=new arraylist<
string
>();
list
.add("hello zha zha");
list
.add(5);//編譯器直接報錯,無法通過編譯。`
2.所有使用泛型引數的地方都會被替換為該泛型的上界(不做約束都是替換為object),將在下面講解。此處使用泛型的意義在於:編寫更通用的**。如:
public
inte***ce
basedao
extends
serializable>
//編譯後改變為:
public
inte***ce
basedao
//你能看出這和普通的**有什麼區別嗎?
使用泛型的意義也就這兩點了,只是做乙個強調,不要糾結於分類的正確性!
萬用字元:我持有一種特殊的型別,但是我不知道他是什麼型別。
list
<?> list1 = new arraylist<>();
list
<?> list2 = new arraylist();
list1.add("abc");//編譯錯誤
list2.add("abc");//編譯錯誤:因為無法知道持有的特殊型別!假如說萬用字元(?)匹配的是integer ,新增的是string豈不是錯誤了!
object:我持有任何型別(除基本變數)。
list list3 = new arraylist<>();
list3.add("zha zha");
list3.add(list1);
list
<? extends user> list = new arraylist<>();
user user = new user();
registeruser registeruser = new registeruser();//繼承自user
loginuser loginuser = new loginuser();//繼承自user
//我的容器裡面的資料至少是user型別,例如:
user user1 = list.get(0);//無論是loginuser 還是 registeruser 都是 user
//錯誤例項
list.add(loginuser);//編譯錯誤:如果list是list,他不能add(new loginuser()),
list.add(registeruser);//編譯錯誤:如果list是list,他不能add(new registeruser()),
list.add(user);//編譯錯誤:同上。
因為我們沒法確定這個容器的型別(registeruser or loginuser)。所以不能新增元素,但是我們能確保獲取到的型別至少是user.
list<? super registeruser> registerusers = new arraylist<>();
user user = new user();
registeruser registeruser = new registeruser();
loginuser loginuser = new loginuser();
teacher teacher = new teacher();
users.add(registeruser);//正確,無論是list還是 list都可以add(new registeruser())
users.add(user);//編譯錯誤,因為該user 有可能是loginuser,該容器有可能是list
users.add(loginuser);//編譯錯誤,同上
users.add(teacher);//編譯錯誤,teacher和user沒有半毛錢關係
registeruser = (registeruser) users.get(0);//未必是registeruser,有可能是user,也有可能是registeruser其他父類,所以要強轉
inte***ce
userdao
extends
user & teacher>
是什麼意思呢? 戰五渣系列之一(sql中的join)
1.為什麼第一篇文章就是sql呢,因為最近看到乙個文章2副圖秒懂sql中的join 最重要的是在我遇到的程式設計師中,不懂join和left join的區別的有很多,促使我不得不戰五渣 2.且看我如何戰五渣!什麼是left join?表 department,employee 需求 查詢部門5 de...
21天精通java基礎之Day14泛型
day14 泛型 不使用泛型的危害 1.不使用泛型,任何object及其子類的物件都可以新增進來。2.強轉為int型時,可能報classcastexception的異常。泛型的使用 1.在集合中使用 test public void test public void test2 2.自定義泛型類 泛...
Asp元件中級入門與精通系列之五
我們學習來看一下response物件。其實我們前面的教程中一直都在使用這個物件的write方法。這裡我們用response物件設定cookie。開啟vb6,新建activex dll工程。工程名修改為fcom,類名修改為fz5 引用 microsoft active server pages obj...