戰五渣系列之四(精通泛型)

2021-07-09 14:05:35 字數 2480 閱讀 2322

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...