更新時(shí)間:2022-12-29 11:24:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1666次
Java 泛型(generics)本質(zhì)是參數(shù)化類型,也就是說(shuō)所操作的Java數(shù)據(jù)類型被指定為一個(gè)參數(shù)。是 JDK 5 中引入的一個(gè)新特性, 泛型提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許程序員在編譯時(shí)檢測(cè)到非法的類型。
你可以寫一個(gè)泛型方法,該方法在調(diào)用時(shí)可以接收不同類型的參數(shù)。根據(jù)傳遞給泛型方法的參數(shù)類型,編譯器適當(dāng)?shù)靥幚砻恳粋€(gè)方法調(diào)用。
1.適用于多種數(shù)據(jù)類型執(zhí)行相同的代碼(代碼復(fù)用)
未使用泛型前,針對(duì)不同的參數(shù)類型需要對(duì)函數(shù)作重載操作
private static int add(int a, int b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static float add(float a, float b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
private static double add(double a, double b) {
System.out.println(a + "+" + b + "=" + (a + b));
return a + b;
}
使用泛型后,可以將多種參數(shù)類型情況復(fù)用為一個(gè)函數(shù)
private static <T extends Number> double add(T a, T b) {
System.out.println(a + "+" + b + "=" + (a.doubleValue() + b.doubleValue()));
return a.doubleValue() + b.doubleValue();
}
1.泛型類
public class TClass {
public static void main(String[] args) {
TClass00<String, Object> tClass = new TClass00<>();
tClass.setKey("hello");
tClass.setValue("world");
System.out.println(tClass.getKey() + " " + tClass.getValue());
tClass.setValue(0.0);
System.out.println(tClass.getKey() + " " + tClass.getValue());
}
}
// 泛型類
class TClass00<K, V> {
private K key;
private V value;
public K getKey() {
System.out.println(key.getClass());
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
System.out.println(value.getClass());
return value;
}
public void setValue(V value) {
this.value = value;
}
}
// 輸出結(jié)果
class java.lang.String
class java.lang.String
hello world
class java.lang.String
class java.lang.Double
hello 0.0
2.泛型接口
public class TImpl {
public static void main(String[] args) {
TImpl00<Float> tImpl00 = new TClass00<>();
tImpl00.hello(0.0f);
}
}
// 定義泛型接口
interface TImpl00<T> {
T hello(T t);
}
// 定義接口的子類
class TClass00<T> implements TImpl00<T>{
@Override
public T hello(T t) {
System.out.println(t.getClass());
System.out.println("hello " + t.toString());
return t;
}
}
// 輸出結(jié)果
class java.lang.Float
hello 0.0
3.泛型方法
public class TMethods {
public static void main(String[] args) {
System.out.println("hello".getClass());
getClass("hello".getClass());
}
/**
* 定義泛型方法的規(guī)則:
* 1.所有泛型方法聲明都有一個(gè)類型參數(shù)聲明部分(由尖括號(hào)分隔),該類型參數(shù)聲明部分在方法返回類型之前
* 2.每一個(gè)類型參數(shù)聲明部分包含一個(gè)或多個(gè)類型參數(shù),參數(shù)間用逗號(hào)隔開。一個(gè)泛型參數(shù),也被稱為一個(gè)類型變量,是用于指定一個(gè)泛型類型名稱的標(biāo)識(shí)符。
* 3.類型參數(shù)能被用來(lái)聲明返回值類型,并且能作為泛型方法得到的實(shí)際參數(shù)類型的占位符。
* 4.泛型方法體的聲明和其他方法一樣。注意類型參數(shù)只能代表引用型類型,不能是原始類型
*/
// 泛型方法
public static <T extends Object> void getClass(T t) {
System.out.println(t);
System.out.println(t.getClass());
}
}
// 輸出結(jié)果
class java.lang.String
class java.lang.String
class java.lang.Class
為了解決泛型中隱含的轉(zhuǎn)換問題,Java泛型加入了類型參數(shù)的上下邊界機(jī)制。
<? extends A>表示該類型參數(shù)可以是A(上邊界)或者A的子類類型。編譯時(shí)擦除到類型A,即用A類型代替類型參數(shù)。
<? super A>表示該類型參數(shù)可以是A(下邊界)或者A的父類類型。
public class TClass {
public static void main(String[] args) {
// TClass00<String, Object> tClass = new TClass00<>();
// tClass.setKey("hello");
// tClass.setValue("world");
// System.out.println(tClass.getKey() + " " + tClass.getValue());
// tClass.setValue(0.0);
// System.out.println(tClass.getKey() + " " + tClass.getValue());
// 上限
TClass00<String, Double> hello = new TClass00<>();
hello.setKey("hello");
hello.setValue(0.0);
hello(hello);
// 下限
TClass00<String, Object> world = new TClass00<>();
world.setKey("hello");
world.setValue("world");
world(world);
}
// 上限
public static void hello(TClass00<? extends String, ? extends Number> tClass00) {
System.out.println(tClass00.getKey() + " " + tClass00.getValue());
}
// 下限
public static void world(TClass00<? super String, ? super Integer> tClass00) {
System.out.println(tClass00.getKey() + " " + tClass00.getValue());
}
}
// 泛型類
class TClass00<K, V> {
private K key;
private V value;
public K getKey() {
System.out.println(key.getClass());
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
System.out.println(value.getClass());
return value;
}
public void setValue(V value) {
this.value = value;
}
}
// 輸出結(jié)果
class java.lang.String
class java.lang.Double
hello 0.0
class java.lang.String
class java.lang.String
hello world
以上就是關(guān)于“Java方法:泛型的簡(jiǎn)介”,如果大家對(duì)此比較感興趣,想了解更多相關(guān)知識(shí),不妨來(lái)關(guān)注一下本站的Java泛型詳解,里面還有更詳細(xì)的介紹,相信對(duì)大家的學(xué)習(xí)一定會(huì)有所幫助的。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)