国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JavaSE】Java進階知識一(泛型詳解,包括泛型方法,協(xié)變,逆變,擦除機制)

這篇具有很好參考價值的文章主要介紹了【JavaSE】Java進階知識一(泛型詳解,包括泛型方法,協(xié)變,逆變,擦除機制)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

泛型

1.?什么是泛型

2.泛型方法

3.通配符上界(泛型的協(xié)變)

4.通配符下界(泛型的逆變)

5.泛型的編譯(擦除機制)


泛型

? ? ? ? 泛型:就是讓一個類能適用于多個類型,就是在封裝數(shù)據(jù)結構時能讓封裝的類型被各種類型使用所以引入了泛型的概念,雖然有了泛型,什么數(shù)據(jù)都可以放,但是更多情況下我們還是希望他只能持有一種數(shù)據(jù)類型。所以,泛型的主要目的:指定當前的容器,要持有什么類型的對象,讓編譯器去做檢查。

1.?什么是泛型

語法格式如下:

泛型類<類型實參>變量名;//定義一個泛型類引用

new 泛型類<類型實參>(構造方法實參);//實例化一個泛型類對象

一般用<T>作為占位符 ,表示當前類是一個泛型類。Java中的泛型參數(shù)只能是引用類型,不能是基本類型,這與Java的泛型擦出機制有關。

?實例:

MyArray<Integer> list = new MyArray<Integer>();

*裸類型(Raw Type)? ? ? (這是一個泛型類但沒有帶著類型實參)?

MyArray list = new MyArray();

裸類型是為了兼容老版本的API保留機制,我們不要輕易使用。?

2.泛型方法

?泛型方法:定義一個泛型方法,我們需要在方法返回值前使用尖括號聲明一個或多個泛型參數(shù)然在方法中就可以用到聲明的泛型參數(shù)了,調用泛型方法時,我們不需要手動寫出類型,編譯器會根據(jù)你的調用,自動推導出具體類型。

靜態(tài)泛型方法:泛型類有一個局限,靜態(tài)方法和靜態(tài)屬性訪問不了類上定義的泛型參數(shù),靜態(tài)泛型方法的定義和使用與普通泛型方法一致。

泛型類和泛型方法的使用場景:

當泛型參數(shù)需要在多個方法或成員屬性間扭轉,就使用泛型類,比如:集合。

當泛型參數(shù)只需要作用于某個方法,那就使用泛型方法。

【JavaSE】Java進階知識一(泛型詳解,包括泛型方法,協(xié)變,逆變,擦除機制),【JavaSE】,java,開發(fā)語言

3.通配符上界(泛型的協(xié)變)

泛型類型是具有不變性的,比如下面代碼就是錯誤的:

Arraylist<Object> objectList;
ArrayList<String> stringList = new ArrayList<>();
objectList=stringList//這里會報錯

objectList.add(new Shit());
String str = stringList.get(0);
//因為我們無法將一個object對象轉化為string對象,所以在編譯層面上面的賦值就會直接報錯

?為了讓泛型變得更靈活,Java引入了通配符:?,通過下面的代碼來給大家介紹一下通配符的作用:

在不使用通配符時,因為泛型的不變性,下面這段代碼會出現(xiàn)問題,就使代碼非常不靈活。

public static double sum(List<Number> list){
   double result =0;
   for(Number number : list){
        result += number.doubleValue();
   }
    return result;
}

List<Double> doubleList = new ArrayList<>();
sum(doubleList)//這里會報錯

我們可以使用通配符上界(?:extends T)來使代碼更靈活

public static double sum(List<? extends Number> list){
   double result =0;
   for(Number number : list){
        result += number.doubleValue();
   }
    return result;
}

List<Double> doubleList = new ArrayList<>();
sum(doubleList)

這種寫法也被叫做泛型的協(xié)變 。

4.通配符下界(泛型的逆變)

我們還可以使用通配符下界(?:super T)來使代碼變得靈活,代碼實例如下:

class Food {
}
class Fruit extends Food {
}
class Apple extends Fruit {
}
class Plate<T> {
private T plate ;
public T getPlate() {
return plate;
}
public void setPlate(T plate) {
this.plate = plate;
}
}
public class TestDemo {
public static void main(String[] args) {
Plate<Fruit> plate1 = new Plate<>();
plate1.setPlate(new Fruit());
fun(plate1);
Plate<Food> plate2 = new Plate<>();
plate2.setPlate(new Food());
fun(plate2);
}
public static void fun(Plate<? super Fruit> temp){
// 此時可以修改??!添加的是Fruit 或者Fruit的子類
temp.setPlate(new Apple());//這個是Fruit的子類
temp.setPlate(new Fruit());//這個是Fruit的本身
//Fruit fruit = temp.getPlate(); 不能接收,這里無法確定是哪個父類
System.out.println(temp.getPlate());//只能直接輸出
}
}

通配符的優(yōu)缺點:

協(xié)變:放寬了對子類類型的泛型約束,但是缺點是不能對調用的參數(shù)進行寫入數(shù)據(jù)只能進行讀取數(shù)據(jù)。

逆變:放寬了對父類類型的泛型約束,但是缺點是不能對參數(shù)進行讀取數(shù)據(jù),只能寫入數(shù)據(jù)。

5.泛型的編譯(擦除機制)

擦除機制的實質就是,在編譯階段,Java的泛型類型可能是ArrayList<Integer>但是在java文件編譯成字節(jié)碼的過程中,泛型參數(shù)部分就被擦出了(泛型類,泛型方法的參數(shù)全部被替換成它的第一個上界或者頂級父類Object),在class文件中,無論參數(shù)是什么,JVM實際執(zhí)行的代碼類型其實是ArrayList<Object>類型,這也就引出了很多問題如下:

  1. 泛型參數(shù)只能是引用類型而不能是基本數(shù)據(jù)類型,因為基本數(shù)據(jù)類型無法被擦除成Object。
  2. 不能使用instanceof關鍵字進行泛型類型檢測,因為在運行時所以的泛型類型都是裸類型。
  3. 泛型類型無法實例化類型參數(shù)T a=new T(),因為在運行時無法確定T的具體類型,也不知道T是否存在無參構造器。
  4. 無法實例化泛型數(shù)組T[] arry =new T[2];因為泛型最后都被擦除成Object數(shù)組,在使用時很容易發(fā)生類型轉化異常,比如object轉化不成string。

擦除機制是Java為了引入泛型這個語法而不得不做出的妥協(xié)之舉,泛型語法是JDK5之后引入的,為了兼容老版本,不得不在編譯階段將泛型擦除成裸類型。但是在其他語言中,泛型的使用會非常自然且簡單安全,在編寫代碼是我們要了解泛型擦除機制,否則可能會引發(fā)很多不必要的異常。

類型擦除是指在運行時對于JVM而言泛型參數(shù)被擦除掉了,并不代表泛型信息消失了,才class文件中泛型信息被以其他方式進行保存,我們依然可以在運行時通過反射的手段進行泛型類型檢測。文章來源地址http://www.zghlxwxcb.cn/news/detail-763613.html

到了這里,關于【JavaSE】Java進階知識一(泛型詳解,包括泛型方法,協(xié)變,逆變,擦除機制)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java 基礎進階篇(十)—— 泛型與可變參數(shù)

    Java 基礎進階篇(十)—— 泛型與可變參數(shù)

    泛型是 JDK5 中引入的特性,可以在編譯階段約束操作的數(shù)據(jù)類型,并進行檢查。 格式: 數(shù)據(jù)類型; 好處:統(tǒng)一數(shù)據(jù)類型。把運行時期的問題提前到了編譯期間,避免了強制類型轉換可能出現(xiàn)的異常,因為編譯階段類型就能確定下來。 注意: 泛型只能支持引用數(shù)據(jù)類型 。集合

    2024年02月03日
    瀏覽(15)
  • Java中泛型和Object類型 初級進階教程(一)

    在學習的過程中,常常看到某個類或者接口等中使用 ListT, TestT,其中T的作用是什么呢? 1 在類中使用泛型 2 使用多個泛型 3 在類中使用泛型 4 在方法中使用泛型 5 限制泛型類型 6 通配符 (Wildcard) 總結:泛型和Object類型之間的區(qū)別 類型安全: 泛型 T : 泛型提供了編譯時類型

    2024年02月01日
    瀏覽(29)
  • 泛型類、泛型接口、泛型方法詳解!

    Java泛型中的那些字母是什么意思?(E、T、K、V、S) 當定義類、接口或方法時,可以使用類型參數(shù)(Type Parameters)來表示未知的類型,從而使代碼更加通用和靈活。下面分別給出類、接口和方法的例子: 在這個例子中, Box 類使用類型參數(shù) T 來表示未知的類型,可以在創(chuàng)建對象

    2023年04月25日
    瀏覽(12)
  • 【JavaSE】Java入門九(異常詳解)

    【JavaSE】Java入門九(異常詳解)

    目錄 異常? 1.Java中異常的體系結構 2.異常的處理 3.自定義異常類 ? ? ?? 在Java中,將程序執(zhí)行過程中發(fā)生的不正常行為稱為異常,C語言中沒有這個概念,接下來我們重點需要掌握異常處理體系(try, catch, throw, finally)以及如何自定義異常類。 異常的種類繁多,Java內(nèi)部維護了

    2024年02月03日
    瀏覽(26)
  • 詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界)

    詳解Java中的泛型(泛型的語法,擦除機制,泛型的上界)

    目錄 一.什么是泛型 二.Java中為什么要使用泛型 三.泛型的語法 四.泛型類的使用 五.泛型的編譯機制(擦除機制) 六.泛型的上界 泛型(Generics)是Java SE 5中引入的一個新特性,可以 使Java中的類和方法具有更廣泛的類型范圍 。通俗的說,它使得我們可以在定義類和方法時指定

    2024年02月05日
    瀏覽(24)
  • Java-泛型機制詳解

    Java集合(Collection)中元素的類型是多種多樣的。例如,有些集合中的元素是Byte類型的,而有些則可能是String類型的,等等。Java允許程序員構建一個元素類型為Object的Collection,其中的元素可以是任何類型在[Java SE](https://baike.baidu.com/item/Java SE/4662159?fromModule=lemma_inlink) 1.5之前,

    2023年04月10日
    瀏覽(18)
  • Java的泛型詳解

    Java泛型是一種編程語言的特性,它允許類、接口和方法在定義時使用一個或多個類型參數(shù),這些類型參數(shù)在調用時會被實際類型替換,從而增強了代碼的重用性和類型安全性。通過使用泛型,我們可以編寫出更加通用的代碼,同時也可以減少代碼中的強制類型轉換操作,提高

    2024年02月04日
    瀏覽(24)
  • java的泛型【詳解】

    java的泛型【詳解】

    定義類、接口、方法時,同時聲明了一個或者多個類型變量(如:E) ,稱為泛型類、泛型接口,泛型方法、它們統(tǒng)稱為泛型。 作用:泛型提供了在編譯階段約束所能操作的數(shù)據(jù)類型,并自動進行檢查的能力!這樣可以避免強制類型轉換,及其可能出現(xiàn)的異常。 1.泛型類:

    2024年02月19日
    瀏覽(18)
  • 【JavaSE】Java方法的使用

    【JavaSE】Java方法的使用

    【本節(jié)目標】 1. 掌握方法的定義以及使用 2. 掌握方法傳參 3. 掌握方法重載 4. 掌握遞歸 目錄 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定義 1.3 方法調用的執(zhí)行過程 1.4 實參和形參的關系 2. 方法重載 2.1 為什么需要方法重載 2.2 方法重載概念 3. 遞歸 3.1 生活中的故事 3.2 遞

    2024年02月12日
    瀏覽(23)
  • Java中泛型詳解,非常詳細

    Java中泛型詳解,非常詳細

    在前面的幾篇文章中,詳細地給大家介紹了Java里的集合。但在介紹集合時,我們涉及到了泛型的概念卻并沒有詳細學習, 所以今天我們要花點時間給大家專門講解什么是泛型、泛型的作用、用法、特點等內(nèi)容。 有些粉絲朋友,在之前就一直很好奇,比如List String 中的 Strin

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包