Java基礎 泛型(一)

2021-09-08 12:21:55 字數 2422 閱讀 2539

使用集合類不加<>也可以,但是使用的時候需要注意型別問題,執行時可能出錯;而且其後還要進行各種上下轉型

因此,當操作的引用資料型別不確定的時候。那就使用<>。將要操作的引用資料型別傳入即可。其實<>就是乙個用於接收型別的引數範圍。

總的來說,在程式中,只要用到了帶有<>的類或者介面,就要明確傳入的具體引用型別。

問題:什麼是引用資料型別?

3.1.擦除

為什麼擦除呢?

據說->因為為了相容執行時的類的載入器

3.2.補償

在執行時,通過獲取元素的型別進行轉換動作。不用使用者在強制轉換了。

可不可以定義乙個工具類,來操作所有物件?這就引入了我們的泛型最重要的應用——泛型類。

在jdk1.5後,使用泛型來接收類中要操作的引用資料型別。

泛型類。什麼時候用?當類中的操作的引用資料型別不確定的時候,就使用泛型來表示。

使用:

public class main 

}class genericdemo

public void set(t obj)

}

//將泛型定義在方法上,返回值的前面修飾符的後邊

public t void show(t tt)

當方法靜態時,不能使用類上定義的泛型。如果靜態方法使用泛型,只能像上面這樣將泛型定義在方法上。 

發現了缺點:能實現的方法知識object類的方法

inte***ce inter

class interdemo implements inter

}

學會了idea重構函式快捷鍵(選中**塊,按下ctrl+alt+m) 

public static void printcollection(collection<?> a)

}

和下面這個有啥區別呢? 

public static void printcollection(collectiona)

}

t可以直接拿來當做類來呼叫方法,?不可以。還有什麼區別????可以接著往下看:

看個例子:

class genericdemo

public void set(t obj)

//其中a是乙個類

public static void printcollection(collection<? extends a> a)

}}

限定其繼承自**。就是我們上面剛用到的例子。格式就是下面這樣,這裡就不再舉例。

? extends e;//接收e型別或其子型別。因此叫做上限
collection裡面的addall方法: bool addall(collection<? extends e> c)表示可以用e型別或其子類。

一般儲存元素時使用上限。因為這樣取出都是按照上線型別來運算的。不會出現型別安全隱患。

? super e;//接收e型別或其父型別。這種叫做下限。
treeset中的建構函式:treeset(compator<? super e> compactor)表示根據指定比較器進行排序。

對集合中的元素做取出操作時可以使用下限。用的不多但是不好理解!!!

在選擇前思考一下:

需要唯一嗎?

需要:set

需要制定順序:

需要: treeset

不需要:hashset

但是想要乙個和儲存一致的順序(有序):linkedhashset

不需要:list

需要頻繁增刪嗎?

需要:linkedlist

不需要:arraylist

如何記錄每乙個容器的結構所屬體系呢?

看名字!

字尾名就是該集合所屬的體系。

list

|--arraylist

|--linkedlist

set|--hashset

|--treeset

字首名就是該集合的資料結構。

而且通常這些常用的集合容器都是不同步的。 

java基礎 泛型

int 定義了乙個陣列,陣列元素的型別是int 泛型 定義了乙個集合,集合元素的型別就是泛型定義的型別 泛型 將執行時期出現的問題classcastexception,轉移到了編譯時期 方便與程式設計師解決問題,讓執行事情問題減少,安全。泛型格式 通過 來定義要引用的資料型別 使用泛型 在集合框架中...

Java基礎 泛型 泛型介面 泛型類 泛型方法

一 二 三 泛型方法 1.public t test t t1,t t2 一 泛型 1.泛型產生的背景 原因1 集合中儲存資料時,編譯期間可以儲存任何型別的資料,導致取值時轉換出錯 原因2 每次取值都需要強制轉換,冗餘繁瑣 2.泛型的定義 泛型的本質是乙個引數化的型別 在程式編碼中一些包含引數的類 ...

java基礎 泛型解析

泛型,編寫的 可以被很多不同型別的物件重用。簡單泛型類的定義 public class generic public generic t info public void setinfo t info public t getinfo private t info 用具體的型別替換型別變數 t 就可...