亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java面試題 說說java的泛型機制是怎麼樣的

說說java的泛型機制是怎麼樣的

Jan 27, 2021 am 09:59 AM
java 泛型

說說java的泛型機制是怎麼樣的

面試官:說一下java的泛型機制是怎麼樣的。

(學習影片分享:java影片教學

精簡版回答

Java在開發(fā)時,透過使用菱形語法< >,使一個類別、介面或方法具有接受泛指的一群類別作為參數(shù),泛指的類別最終由尖括號裡的規(guī)則所限定,泛指類別通常用大寫字母表示,一般用字母T,後期經(jīng)過Java編譯器編譯,泛型將被擦除,根據(jù)具體使用的類,替換泛型,產(chǎn)生class字節(jié)碼,所以泛型是對Jvm透明的。

豪華版回答

泛型於JDK1.5正式引入

#Java引入泛型背景

Java集合是允許放入多種類型的,例如

    List list=new ArrayList();
    list.add("String");
    list.add(1024);

這在JDK1.5之前是常見的使用方式,即便放在今天的JDK下,也是允許的,那麼類似於這種集合的使用方式,就會帶來一些問題,就是集合中究竟放了哪些類型,恐怕只有創(chuàng)建集合的人才知道,其他調(diào)用者,根本無法確定,這樣在大型項目裡,極易出現(xiàn)問題,調(diào)用者強轉集合裡的某個對象,一旦類型錯誤,就會報錯,這種錯在當時編譯階段是無法發(fā)現(xiàn)的,只有執(zhí)行時才被發(fā)現(xiàn),為了解決類似問題,JDK引進了泛型。

泛型類型

引入泛型後,因此可以在編譯階段,檢查型別是否符合要求,很大程度上,杜絕了盲目的型別轉換。 泛型主要工作在編譯器,編譯後,JVM執(zhí)行時,是無法感知泛型的。 泛型分為普通泛型和通配泛型。

1.普通泛型

這類泛型顧名思義,就是支援呼叫時傳入任意型別,但是呼叫時,等號左右兩邊泛型必須一致。 JDK1.7右側菱形可以省略。

class Test<T>{...} //聲明時
Test<Integer> test = new Test<Integer>(); //調(diào)用時
Test<Integer> test = new Test(); //1.7調(diào)用時

3.界限泛型

<?>//無界泛型,任意類型都匹配
<T extends ClassA>//有界泛型 - 繼承自某父類
<T extends InterfaceB>//有界泛型 - 實現(xiàn)某接口
<T extends ClassA & InterfaceB & InterfaceC ... >//有界泛型 - 多重邊界
<T super ClassC>//有界泛型 - 指定類父類

泛型擦除

#剛才說到,泛型只在寫程式碼時和編譯時起作用,而Jvm則載入class運行時是無感透明的,是因為編譯器編譯時將泛型擦除了,簡單不嚴謹?shù)恼f就是:把類別或方法上的那個<>尖括號幹掉了,根據(jù)尖括號裡的規(guī)則換成具體的類,所以Jvm運行時根本不知道這段程式碼里之前有過泛型,這樣做是為了兼容,前面說到泛型是JDK1.5才引入的,這樣,即便引入泛型,現(xiàn)有的Jvm也不需要大改,只要改一下編譯器即可,對於這種編譯器能感知的語法,而虛擬機無法感知的,人們把這種語法稱作語法糖(suger),編譯器經(jīng)過脫糖(Desuger) 後,拿到乾貨,交給虛擬機器去執(zhí)行。

(圖文教學推薦:java入門教學

泛型擦除機制

//Pair的泛型
public class Pair<T> {

    private T mFirst;
    private T mSecond;

    public T getmFirst() {
        return mFirst;
    }

    public void setmFirst(T mFirst) {
        this.mFirst = mFirst;
    }

    public T getmSecond() {
        return mSecond;
    }

    public void setmSecond(T mSecond) {
        this.mSecond = mSecond;
    }
}

//Pair的原始類型
//無論何時定義一個泛型類型,都會自動提供一個相應的 原始類型
public class Pair {

    private Object mFirst;
    private Object mSecond;

    public Object getFirst() {
        return mFirst;
    }

    public void setFirst(Object mFirst) {
        this.mFirst = mFirst;
    }

    public Object getSecond() {
        return mSecond;
    }

    public void setmSecond(Object mSecond) {
        this.mSecond = mSecond;
    }
}

//如果調(diào)用Pair<T extends String>編譯擦除后得到如下=
class Pair{
    private String mFirst;
    private String mSecond;
    ...
}

當泛型作為方法的入?yún)r,擦除後換成通配泛型的下界,例如add方法

public static void insertElements(List<? super A> list){
    //Add進來的都是層級“小于等于”A的,也就是下界
    list.add(new A());
    list.add(new B());
    list.add(new C());
}

當泛型作為方法的回參時,擦除後換成通配泛型的上界,例如get方法

public void processElements(List<? extends A> elements){
   //for循環(huán)挨個get list 里的數(shù)據(jù),都當做A,也就是都當做上界
   for(A a : elements){
      System.out.println(a.getValue());
   }
}

對於泛型的類型擦除說再多,看再多博客,不如官方定義準確,放一段Oracle官方對於類型擦除的文檔

Type Erasure
Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:
Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.Insert type casts if necessary to preserve type safety.Generate bridge methods to preserve polymorphism in extended generic types.Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

更多面試題請點擊: java面試題目及答案

#

以上是說說java的泛型機制是怎麼樣的的詳細內(nèi)容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內(nèi)容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設置。 JSON位置 VSCODE設置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務,必須先關閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務;2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應使用try-with-resources管理資源,妥善處理異常並關閉連接,避免連接洩漏;此外建議使用連接池、設置保存點實現(xiàn)部分回滾,並保持事務盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

了解Java虛擬機(JVM)內(nèi)部 了解Java虛擬機(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(wǎng)絡端口和防火牆 了解網(wǎng)絡端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

See all articles