學習筆記,僅供參考,有錯必糾
泛型類
泛型類概述
泛型類,就是在定義類時,在類名後加一個尖括號:
public class 類名<泛型類型1,…>
//一般泛型會設置爲一個大寫字母,比如<T>等等
需要注意的是,泛型類型必須是引用類型。在我們定義這個泛型時,該泛型並沒有明確的數據類型,但是當我們創建該類對象時,我們指定的泛型類型是啥(比如<Person>
),這個泛型類型<T>
就是啥。
比如,在我們創建ArrayList對象時,我們指定泛型爲<Person>
,那我們就只能在其中添加Person類型的元素,而不能添加其他類型的元素(比如String, Integer等等),否則會在編譯時報錯:
package com.guiyang.restudy3;
import java.util.ArrayList;
import java.util.Iterator;
import com.guiyang.bean.Person;
public class D1Genric {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("張三", 23));
list.add(new Person("李四", 24));
Iterator<Person> it = list.iterator();
while(it.hasNext()) {
Person p = it.next();
System.out.println(p.getName() + "..." + p.getAge());
}
}
}
- 自定義泛型類
package com.guiyang.object;
public class Tool<Q> {
private Q q;
public Q getobj() {
return q;
}
public void setobj(Q q) {
this.q = q;
}
}
泛型方法
- 泛型方法概述
具有一個或多個類型變量的方法,稱之爲泛型方法。泛型方法可以存在於泛型類中,也可以存在於非泛型類中。泛型方法最好與類的泛型一致,如果不一致,需要在方法上聲明該泛型。
簡而言之,泛型方法,就是把泛型定義在方法上的方法。
- 定義格式
public <泛型類型> 返回類型 方法名(泛型類型 變量名)
- 自定義泛型類,非靜態泛型方法,靜態泛型方法
package com.guiyang.object;
public class Tool<Q> {
private Q q;
public Q getobj() {
return q;
}
public void setobj(Q q) {
this.q = q;
}
public<T> void show(T t) {
System.out.println(t);
}
public static<W> void print(W w) {
System.out.println(w);
}
}
注意!非靜態泛型方法的泛型可以與類的泛型類型一致,也可以不一致。但是靜態泛型方法的泛型類型必須與類的泛型類型不一致,否則,會在編譯時報錯。(媽呀,這句話好繞口)
類泛型 <Q>
會在Tool類創建對象時被賦值,而靜態方法的泛型 <W>
,會在我們用類名調用靜態方法時被賦值。
泛型接口
- 泛型接口概述
簡而言之,泛型接口就是把泛型定義在接口上的接口。
- 定義格式
public interface 接口名<泛型類型>
- 自定義泛型接口
實現接口方式1(推薦):
interface Inter<T> {
public void show(T t);
}
class Demo implements Inter<String> {
@Override
public void show(String t) {
System.out.println(t);
}
}
我們創建Demo類實現了Inter接口,並制定泛型爲 <String>
,此時,我們重寫的show方法的泛型也應該是<String>
,這是因爲,Inter接口的show方法的泛型與Inter接口泛型是一致的,而Demo類實現了該接口,就應該遵從這種規則。
實現接口方式2(不推薦):
interface Inter<T> {
public void show(T t);
}
class Demo<T> implements Inter<T> { //沒有必要在實現接口的時候給自己加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
泛型通配符
- 泛型通配符是啥?
泛型通配符就是 <?>
,如果在開發過程中,我們不確定右邊接收的泛型類型,則我們可以先將左邊的泛型類型用?
來代替,這個?
代表的就是任意類型,比如:
List<?> list = new ArrayList<String>();
//或
List<?> list = new ArrayList<Integer>();