自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

當Java遇上泛型:類型安全的魔法之旅

開發(fā) 前端
泛型,即“參數(shù)化類型”,就是將類型由原來的具體類型參數(shù)化,類似于方法中的變量參數(shù),此時類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時傳入具體的類型(類型實參)。

哈嘍,大家好,我是了不起。

泛型是jdk1.5之后出現(xiàn)的新特性,其本質(zhì)是參數(shù)化類型(type parameters),通過參數(shù)化類型讓代碼可以應用于多種類型。

泛型是什么

泛型,即“參數(shù)化類型”,就是將類型由原來的具體類型參數(shù)化,類似于方法中的變量參數(shù),此時類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時傳入具體的類型(類型實參)。

常用的泛型變量

  • Element(E):元素,多用于java框架集合
  • Key(K) :關鍵字
  • Number(N) : 數(shù)字
  • Type(T) : 類型
  • Value(V) : 值

如果沒有泛型會怎么樣?

public class Demo {

    public static int add(int a ,int b){
        return a+b;
    }

    public  static  float add(float a,float b){
        return a+b;
    }
    
    public static void main(String[] args) {
        Demo.add(1, 2);
        Demo.add(1f, 2f);
    }
}

如果我們利用泛型,只需要定義一個方法

public class Demo {

    public static <T extends Number> int add(T a, T b) {
        System.out.println(a + "+" + b + "=" + (a.intValue() + b.intValue()));
        return a.intValue() + b.intValue();
    }

    public static void main(String[] args) {
        Demo.add(1, 2);
        Demo.add(1f, 2f);
    }
}

所以泛型的意義在于

  1. 適用于多種數(shù)據(jù)類型執(zhí)行相同的代碼
  2. 泛型中的類型在使用時指定,不需要強制轉(zhuǎn)換類型(類型安全,編譯器會檢查類型)

泛型的使用

泛型類

示例:

public class DemoT<T> {
    private T data;

    public T getData(){
        return data;
    }

    public void setData(){
        this.data = data;
    }
}

案例

@Data
public class Person<A> {
    private  String name;
    private int age;
    private A data;
}

public class Demo {
    public static void main(String[] args) {
        //傳入String類型
        DemoT<String> t = new DemoT<>(); 
        t.setData("泛型");
    }
}

泛型接口

示例:

public interface IntercaceName<T> {
    T getData();
}

實現(xiàn)接口時,可以選擇指定泛型類型,也可以選擇不指定,如下:

指定類型:

public class Interface1 implements IntercaceName<String>{
    private String text;
    @Override
    public String getData() {
        return text;
    }
}

不指定類型:

public class Interface1<T> implements IntercaceName<T>{
    private T text;
    @Override
    public T getData() {
        return text;
    }
}

泛型方法

示例:

private static <T> T 方法名 (T a,T b){}

public class Demo {
    public static void main(String[] args) {
        print("泛型");
    }
    public static <A> void print(A a){
        System.out.println(a);
    }
}

泛型限制類型

在使用泛型時,可以指定泛型的限定區(qū)域

  • 例如:必須是某某類的子類或 某某接口的實現(xiàn)類,格式:

<T extends 類或接口1 & 接口2>

泛型中的通配符 ?

//1. <? extends Parent> 指定了泛型類型的上屆
//2. <? super Child> 指定了泛型類型的下屆
//3. <?> 指定了沒有限制的泛型類型

public class Demo {
    public static void main(String[] args) {
        //上屆限定
        //不能將一個裝著蘋果的盤子,看做一個裝著水果的盤子
        Plants<? extends Fruit> p = new Plants<Apple>();
        //下屆限定
        Plants<? super Apple> p1 = new Plants<Fruit>();
    }
}
interface Fruit{}
class Apple implements Fruit{}
class Plants<T>{
    T data;
}

作用

  1. 提高了代碼復用率
  2. 泛型中的類型在使用時指定,不需要強制類型轉(zhuǎn)換(類型安全,編譯器會檢查類型)

注意

在編譯之后程序會采取去泛型化的措施,也就是說Java中的泛型,只在編譯階段有效。

在編譯過程中,正確檢驗泛型結(jié)果后,會將泛型的相關信息擦除,并且在對象進入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說泛型信息不會進入到運行時階段。

總結(jié)

相信大家日常工作中肯定是經(jīng)常用到泛型,尤其是集合的使用。有時候也會自定泛型來簡化代碼,一句話就是能用泛型就盡量用泛型。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2019-09-04 00:20:10

JSON泛型擦除

2011-03-16 14:51:35

2020-12-22 09:31:43

區(qū)塊鏈安全食品

2013-05-22 09:33:09

交互設計設計時間

2016-10-21 15:57:39

Rust編輯語言Fedora

2022-02-24 16:15:16

OpenHarmon鴻蒙OpenEuler

2011-04-13 09:16:55

泛型

2013-03-20 09:27:33

C#泛型

2017-06-28 11:34:55

銳捷 醫(yī)療 物聯(lián)網(wǎng)

2015-01-07 15:49:21

大數(shù)據(jù)SSD

2017-08-18 14:47:31

DDD微服務架構

2022-06-19 22:54:08

TypeScript泛型工具

2009-09-08 16:36:10

LINQ查詢基于泛型類

2009-08-24 14:51:25

C# 泛型泛型類型

2009-04-24 09:33:12

LINQ查詢非泛型

2009-09-14 18:57:19

LINQ查詢

2024-06-07 10:05:31

2014-04-15 16:01:00

Java8泛型

2017-05-16 14:38:25

2013-11-08 09:15:32

大數(shù)據(jù)平板電腦
點贊
收藏

51CTO技術棧公眾號