第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java泛型類型擦除:何時(shí)以及發(fā)生了什么?

Java泛型類型擦除:何時(shí)以及發(fā)生了什么?

寶慕林4294392 2019-05-25 16:42:40
Java泛型類型擦除:何時(shí)以及發(fā)生了什么?我在Oracle的網(wǎng)站上讀到了Java的類型擦除。什么時(shí)候發(fā)生類型擦除?在編譯時(shí)還是運(yùn)行時(shí)?當(dāng)班級(jí)加載?當(dāng)類被實(shí)例化時(shí)?很多站點(diǎn)(包括上面提到的官方教程)都說在編譯時(shí)會(huì)發(fā)生類型擦除。如果在編譯時(shí)完全刪除了類型信息,那么當(dāng)調(diào)用使用泛型的方法而沒有類型信息或錯(cuò)誤的類型信息時(shí),JDK如何檢查類型兼容性?考慮以下示例:Say class A有一個(gè)方法,empty(Box<? extends Number> b)。我們編譯A.java并獲取類文件A.class。public class A {     public static void empty(Box<? extends Number> b) {}}public class Box<T> {}現(xiàn)在我們創(chuàng)建另一個(gè)類B,該類empty使用非參數(shù)化參數(shù)(原始類型)調(diào)用該方法:empty(new Box())。如果我們編譯B.java與A.class在類路徑中,javac的是足夠聰明,引發(fā)警告。所以A.class 有一些類型信息存儲(chǔ)在其中。public class B {     public static void invoke() {         // java: unchecked method invocation:         //  method empty in class A is applied to given types         //  required: Box<? extends java.lang.Number>         //  found:    Box         // java: unchecked conversion         //  required: Box<? extends java.lang.Number>         //  found:    Box         A.empty(new Box());     }}我的猜測(cè)是類加載時(shí)會(huì)發(fā)生類型擦除,但這只是猜測(cè)。那么什么時(shí)候發(fā)生?
查看完整描述

4 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗(yàn) 獲得超2個(gè)贊

類型擦除適用于泛型的使用。人們確實(shí)在類文件元數(shù)據(jù)說的方法/類型是否通用的,什么約束等,但仿制藥的時(shí)候使用,他們轉(zhuǎn)換成編譯時(shí)檢查和執(zhí)行時(shí)間蒙上。所以這段代碼:

List<String> list = new ArrayList<String>();list.add("Hi");String x = list.get(0);

編譯成

List list = new ArrayList();list.add("Hi");String x = (String) list.get(0);

在執(zhí)行時(shí),無法找到T=String列表對(duì)象 - 信息消失了。

...但是List<T>界面本身仍然宣稱自己是通用的。

編輯:只是為了澄清,編譯器并保留有關(guān)的信息變量是一個(gè)List<String>-但您仍然無法找出T=String列表對(duì)象本身。


查看完整回答
反對(duì) 回復(fù) 2019-05-25
?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊

Java語(yǔ)言中的泛型是一個(gè)非常好的指南。

泛型由Java編譯器實(shí)現(xiàn)為稱為擦除的前端轉(zhuǎn)換。您可以(幾乎)將其視為源到源的轉(zhuǎn)換,從而將通用版本loophole()轉(zhuǎn)換為非泛型版本。

所以,它是在編譯時(shí)。JVM永遠(yuǎn)不會(huì)知道ArrayList你使用了哪個(gè)。

我還建議Skeet先生的答案是什么是Java中泛型的擦除概念?


查看完整回答
反對(duì) 回復(fù) 2019-05-25
  • 4 回答
  • 0 關(guān)注
  • 1736 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)