我相信,絕大多數初始Java泛型的同學都會感到這個知識點理解起來有些困難,在這里我會對java泛型相關知識點做一個詳細的介紹,包括:入門泛型必懂的知識點、通配符、泛型擦除以及泛型應用四個內容。今天我來講解第一個知識點:入門泛型必懂的知識點。先幫大家掃清泛型基礎概念的相關知識點,也歡迎大家持續關注我的后續文章。
泛型的英文是 generics,generic 的意思是通用,而翻譯成中文,泛應該意為廣泛,型是類型。所以泛型就是能廣泛適用的類型。但泛型還有一種較為準確的說法就是為了參數化類型,或者說可以將類型當作參數傳遞給一個類或者是方法。我們通過兩個實例對比來了解使用泛型和好處。
1.不使用泛型的實例- public class ValueDemo {
- Object value;
- public Object getValue() {
- return value;
- }
- public void setValue(Object value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemo demo = new ValueDemo();
- demo.setValue(888);
- int value = (int) demo.getValue();
- demo.setValue("hello");
- String value1 = (String) demo.getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
- public class ValueDemoT<T> {
- T value;
- public T getValue() {
- return value;
- }
- public void setValue(T value) {
- this.value = value;
- }
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- ValueDemoT<Integer> demo = new ValueDemoT<Integer>();
- demo.setValue(888);
- Integer value = demo.getValue();
- ValueDemoT<String> demo1 = new ValueDemoT<String>();
- demo1.setValue("hello");
- String value1 = demo1 .getValue();
- System.out.println(value);
- System.out.println(value1);
- }
- }
通過上面的例子我們可以發現使用泛型的好處主要有三點:
1.相對于Object 代替一切類型這種方式,泛型不再需要對取出來的結果進行強制轉換了!泛型使得數據的類型可以像參數一樣由外部傳遞進來,實現類型參數化。
2.泛型參數一旦確定好,如果類型不匹配,編譯器就不通過。如下圖所示:
這是一種類型安全檢測機制,一定程度上提高了軟件的安全性防止出現低級的失誤。
3.泛型提高了程序代碼的可讀性,不必要等到運行的時候才去強制轉換,在定義或者實例化階段,因為 ValueDemoT 這個類型顯化的效果,程序員能夠一目了然猜測出代碼要操作的數據類型。
泛型類、泛型方法和泛型接口泛型按照使用情況可以分為 3 種。
- 泛型類。
- 泛型方法。
- 泛型接口。
- public class Demo<T> {
- T field1;
- }
實例化方法如下:
- Demo <String> demo1=new Demo <>();
- Demo <Integer> demo2 =new Demo<>();
泛型方法必須以進行聲明,其中包括有參方法和無參方法,具體代碼如下
- public class Demo {
- //無返回值的方法
- public <T> void testMethod1(T t){
- //code
- }
- //有返回值的方法
- public <T> T testMethod2(T t){
- return null;
- }
- }
泛型接口與泛型類的定義及使用基本相同,代碼如下:
- public interface DemoT<T> {
- public T test();
- }
在使用泛型的時候,我們還可以為傳入的泛型類型實參進行上下邊界的限制。
使用的代碼如下:
- public class Vehicle {
- public void drive() {};
- public void brake() {};
- }
- public class Car extends Vehicle {
- public void drive() {
- System.out.println("car的drive方法");
- };
- public void brake() {
- System.out.println("car的brake方法");
- };
- }
- public class Benz extends Car{
- public void drive() {
- System.out.println("benz drive");
- };
- }
定義一個泛型方法
- public class CarT {
- public static void main(String[] args) {
- getCar(new Benz());
- getCar(new Car());
- getCar(new Vehicle()); //IDE報錯
- }
- public static <T extends Car> void getCar(T car) {
- car.drive();
- }
可以看到方法getCar(T car) 中的參數只能傳入 Car類或者其子類的實例,而Car的父類Vehicle的實例則不能傳入!super的使用跟extends類似,這里就不再詳細講解了
泛型的注意點1.泛型方法中的泛型參數與類的泛型參數沒有關聯,代碼如下:
- public class Demo1<T> {
- public <T> T testMethod1(T t){
- return t;
- }
- public static void main(String[] args) {
- Demo1<String> demo=new Demo1<String> ();
- Integer i=demo.testMethod1(new Integer(123));
- System.out.println(i);
- }
- }
可以看到Demo1
2.出于規范的目的,泛型中的T 只是一種習慣性寫法,我們可以把替換為其他標識,例如。常見的其他約定寫法如下:
- T 代表一般的任何類。
- E 代表 Element 。
- K 代表 Key 。
- V 代表 Value,通常與 K 一起配合使用。
3.泛型可以有多個參數,我們以2個參數為例,代碼如下:
- public class ValueDemoT2<A,B> {
- A value1;
- B value2;
- public void setValue(A p_value1,B p_value2) {
- value1 = p_value1;
- value2 = p_value2;
- }
- public static void main(String[] args) {
- ValueDemoT2<Integer,String> demo = new ValueDemoT2<Integer, String>();
- demo.setValue(123456,"hello");
- System.out.println(demo.value1);
- System.out.println(demo.value2);
- }
- }
執行代碼輸出:
- 123456
- Hello
4.泛型類或者泛型方法中,不接受 8 種基本數據類型。例如下面代碼則無法編譯通過
- List<int> li = new ArrayList<>();
原文鏈接:https://www.toutiao.com/i6970845851816100385/