泛型的用處
- 將運(yùn)行時的異常提前至了編譯時
- 避免了無謂的強(qiáng)制類型轉(zhuǎn)換
自定義泛型
自定義泛型就是一個數(shù)據(jù)類型的占位符或者是一個數(shù)據(jù)類型的變量揍移。
自定義泛型的命名符合標(biāo)識符的規(guī)則即可辕漂,但時黍图,一般用大寫字母T(Type) 或 E (Element)表示。
1.方法上自定義泛型
修飾符 <聲明的自定義泛型> 返回值類型 函數(shù)名(使用的自定義泛型...) {
}
public <T> T test(T t) {
return t;
}
2.泛型類
class 類名<聲明自定義泛型>{
}
class Test<T> {
public void add(T t) {
}
public T remove(T t) {
return t;
}
}
注意
1.泛型類定義的泛型的具體數(shù)據(jù)類型和措,是在使用該類創(chuàng)建對象時確定的庄呈。
2.當(dāng)使用泛型類創(chuàng)建對象時,沒有指定具體的泛型數(shù)據(jù)類型派阱,則默認(rèn)為Object诬留。
3.泛型類上的自定義泛型,不能作用于靜態(tài)方法贫母。
4.靜態(tài)方法如果要使用自定義泛型文兑,需要自己聲明使用。
3.泛型接口
interface 接口名<聲明自定義泛型> {
返回值類型 函數(shù)名(使用的自定義泛型...);
}
interface Test<T> {
T add(T t);
}
//如果要延長接口自定義泛型的具體數(shù)據(jù)類型腺劣,那么格式如下
class ImpTest<T> implements Test<T> {
@Override
public T add(T t) {
return null;
}
}
注意
1.泛型接口定義的泛型的具體數(shù)據(jù)類型绿贞,是在實(shí)現(xiàn)接口的時候確定的。
2.當(dāng)使用泛型接口時橘原,沒有指定具體的泛型數(shù)據(jù)類型時籍铁,則默認(rèn)為Object類型。
泛型的上下限
限制上下限需要通配符:?
上限:? super 目標(biāo)類
下限:? extends 目標(biāo)類
1.泛型的上限
定義一個函數(shù)可以接收任意數(shù)據(jù)類型的集合對象趾断,要求接收的集合對象只能存儲Integer或者其父類類型的數(shù)據(jù)拒名。
public static<T> Collection<? super Integer> test(Collection<? super Integer> t) {
return t;
}
2.泛型的下限
定義一個函數(shù)可以接收任意數(shù)據(jù)類型的集合對象,要求接收的集合對象只能存儲Number或者其子類類型數(shù)據(jù)芋酌。
public void test(Collection<? extends Number> collection) {
}
泛型的擦除轉(zhuǎn)換
泛型編譯之后就消失(擦除)增显。
當(dāng)把帶有泛型的集合賦給不帶泛型的集合,此時泛型就被擦除(手動擦除)隔嫡。
ArrayList<Integer> arrayList = new ArrayList<>();
ArrayList arrayList2 = new ArrayList<>();
//泛型擦除
arrayList2 = arrayList;
arrayList2.add("Test");
System.out.println(arrayList2);
枚舉
enum Demo {
MAN, WOMAN;
}
枚舉應(yīng)用場景
如果存在多個數(shù)據(jù)選項(xiàng)甸怕,但每次只能選擇一個時,可以用枚舉腮恩。
枚舉注意細(xì)節(jié)
1.枚舉是一個特殊的類梢杭,枚舉值必須位于枚舉類的第一行。
2.枚舉類的構(gòu)造方法默認(rèn)的修飾符是private秸滴,自定義的構(gòu)造函數(shù)也要是private武契。
3.枚舉值默認(rèn)的修飾符是public static final,可以定義自己的成員變量與成員函數(shù)
4.枚舉值的數(shù)據(jù)類型是該枚舉值所屬類的類型,然后枚舉值是指向了本類的對象的咒唆。
5.枚舉類可以存在抽象方法届垫,但是枚舉值必須要實(shí)現(xiàn)抽象的方法。
public static void main(String[] args) {
Demo demo = Demo.MAN;
demo.value = "測試數(shù)據(jù)";
demo.run();
}
enum Demo {
MAN("男") {
@Override
public void run() {
System.out.println("男人疾跑:" + value);
}
}, WOMAN("女") {
@Override
public void run() {
System.out.println("女生慢跑:" + value);
}
};
String value;
Demo(String value) {
this.value = value;
}
public abstract void run();
}
enum EnumDemo {
MAN, WOMAN
}
public class Main {
public static void main(String[] args) {
demo(EnumDemo.MAN);
}
public static void demo(EnumDemo demo) {
switch (demo) {
case MAN:
System.out.println("男");
break;
case WOMAN:
System.out.println("女");
break;
}
}
}