DAY8.1 Java核心基礎
泛型
Generics 是指在類定義時不指定類中信息的具體數據類型,而是用一個標識符來代替,當外部實例化對象時再指定具體的數據類型。
在定義類或者接口時不明確指定類中信息的具體數據類型,在實例化時再來指定具體的數據類型
極大地提升了類的擴展性,一個類可以裝載各種不同的數據類型
泛型可以指代類中的成員變量數據類型,方法的返回值數據類型以及方法的參數數據類型。
基本使用:
定義一個Demo不指定類中的具體數據類型,用標識符代替
public class Demo<T>{private T t;public Demo(T t) {this.t = t;}public T getT() {return t;}public void setT(T t) {this.t = t;}
}
public static void main(String[] args) {Demo<String> hello = new Demo<>("hello");System.out.println(hello.getT());Demo<Integer> integerDemo = new Demo<>(11);System.out.println(integerDemo.getT());
}
輸出:
泛型也可以同時寫多個泛型
public class Demo<T,A,B>{private T t;private A a;private B b;public Demo(T t, A a, B b) {this.t = t;this.a = a;this.b = b;}@Overridepublic String toString() {return "Demo{" +"t=" + t +", a=" + a +", b=" + b +'}';}
}
public static void main(String[] args) {Demo<String, Integer, Float> hello = new Demo<>("hello", 1, 2.0f);System.out.println(hello);
}
泛型通配符<?>:在不確定傳入的數據類型的時候可以使用通配符
public static void main(String[] args) {ArrayList<Integer> integers = new ArrayList<>();test(integers);ArrayList<String> strings = new ArrayList<>();test(strings);
}
public static void test(ArrayList<?> list) {System.out.println(list);
}
比如傳入的參數是Interger類型和String類型,如果定義ArrayList list作為形參則String類型的數組無法傳遞
泛型的上限和下限
上限:類名<? extends A> 這個類型必須是A類的子類或者A類型本身
下限:類名<? super A> 這個類型必須是A類的父類或則A類型本身
public class Test {public static void main(String[] args) {ArrayList<Double> doubles = new ArrayList<>();doubles.add(1.0);test1(doubles);ArrayList<Object> strings = new ArrayList<>();strings.add("hello");test2(strings);}/*** 標識test1方法的list參數的類型是Number的子類或者是Number本身,比如 Integer、Double、Float...* @param list*/public static void test1(ArrayList<? extends Number> list) {System.out.println(list);}/*** 表示test2方法的list參數的類型是String的父類或者是String本身,String or Object* @param list*/public static void test2(ArrayList<? super String> list) {System.out.println(list);}
}
泛型接口
public interface MyInterface<T> {public T test();
}
實現類:
public class MyInterfaceImpl1 implements MyInterface<String>{public String t;public MyInterfaceImpl1(String t) {this.t = t;}@Overridepublic String test() {return t;}
}
public class MyInterfaceImpl2<T> implements MyInterface<T>{public T t;public MyInterfaceImpl2(T t) {this.t = t;}@Overridepublic T test() {return t;}
}
兩個實現類,一個在實現的時候就定義了類型,一個沒有定義,所以MyInterfaceImpl1就不能在使用的時候指定其它類型對象,就只能使用String類型
正確測試代碼:
public static void main(String[] args) {MyInterfaceImpl1 myInterfaceImpl1 = new MyInterfaceImpl1("123");System.out.println(myInterfaceImpl1.test());MyInterfaceImpl2<Integer> myInterfaceImpl2 = new MyInterfaceImpl2<>(123);System.out.println(myInterfaceImpl2.test());
}