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

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

為什么JAVA 10中的var無法初始化為null?

為什么JAVA 10中的var無法初始化為null?

慕勒3428872 2021-04-09 22:19:50
我正在嘗試在JAVA 10中引入的新功能,在其中發(fā)現(xiàn)了一個(gè)非常有趣的事實(shí),即您不能使用null聲明變量。在您編寫以下代碼后,var a = null;它拋出一個(gè)錯(cuò)誤:變量初始值設(shè)定項(xiàng)為null現(xiàn)在,眾所周知,我們不能將原始類型聲明為null,因此下面的語句沒有任何意義。int a  = null;這意味著,如果開發(fā)人員正在使用null初始化var,則它肯定要在其中放置一個(gè)Object,而不是文字val。如果是這樣,我的問題是為什么編譯器不將其視為Object var而是拋出錯(cuò)誤。另一方面,如果您編寫以下語句,則可以很好地工作:var a = (Object)null;用null聲明var的原因是什么考慮以下情況,我想初始化var并想在條件塊外使用它:var a = null;if(some condition) Initialize with some argumentselse Initialize with some other arguments//Use a variable here因此,在這種情況下,由于我們希望a的范圍在條件塊之外,因此我們有必要初始化它,如果if塊,則它將為null,這在使用var時(shí)是不可能的。
查看完整描述

3 回答

?
嚕嚕噠

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

編譯器可以應(yīng)用于(至少)三種可能的類型推斷策略var o = null

  • 挑選 Void

  • 挑選 Object

  • 尋找稍后的初始化并選擇該類型

所有這些在技術(shù)上都是可行的,因此出現(xiàn)了一個(gè)問題,這對(duì)開發(fā)人員來說最有意義。

顯然,這Void是毫無用處的,我認(rèn)為這Object也沒有太大用處。盡管正確,但選擇其中任何一種類型都不太可能幫助開發(fā)人員編寫更好和更具可讀性的代碼。

避免初始化的最后一個(gè)選項(xiàng)不是為了避免所謂的“遠(yuǎn)距離動(dòng)作”錯(cuò)誤而特意采用的:


var parent = null;

// imagine some recursion or loop structure, so this makes more sense

processNode(parent); // expects a parameter of type `Node`

parent = determineParent(); // returns a parameter of type `Node`

如果編譯器推斷Node為parent,因?yàn)閐etermineParent()回報(bào)它,這將匯編。但是代碼很脆弱,因?yàn)楦淖詈笠恍锌赡軙?huì)導(dǎo)致在第一行中選擇不同的類型,從而在第二行中編譯錯(cuò)誤。這不好!


我們已經(jīng)習(xí)慣了這樣的事實(shí),即更改類型的聲明可能會(huì)導(dǎo)致錯(cuò)誤,但在此更改(第3行),其效果(第1行)和隨之而來的錯(cuò)誤(第2行)可能相距甚遠(yuǎn),這使得對(duì)于開發(fā)人員來說,了解或更好地預(yù)測(cè)會(huì)發(fā)生什么事情要復(fù)雜得多。


通過保持簡(jiǎn)單的類型推斷規(guī)則,開發(fā)人員可以更輕松地形成一個(gè)簡(jiǎn)單但正確的思維模式。


附錄

令人懷疑的是,從以后的初始化中推斷類型的選項(xiàng)3在技術(shù)上是否確實(shí)可行。我的看法是基于對(duì)JEP 286的理解,尤其是:


另一方面,我們可以將該功能擴(kuò)展為包括“空白”末尾的局部等效項(xiàng)(即,不需要初始化程序,而是依賴于明確的賦值分析。)我們選擇了“僅具有初始化程序的變量”的限制覆蓋了很大一部分候選對(duì)象,同時(shí)保持了功能的簡(jiǎn)單性并減少了“遠(yuǎn)距離操作”錯(cuò)誤。


同樣,在推斷類型時(shí),我們也可以考慮所有分配,而不僅僅是初始化程序。雖然這將進(jìn)一步增加可利用此功能的本地人的比例,但也會(huì)增加“遠(yuǎn)距離行動(dòng)”錯(cuò)誤的風(fēng)險(xiǎn)。


查看完整回答
反對(duì) 回復(fù) 2021-04-18
?
元芳怎么了

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

我要問的是,在這種情況下,我們?nèi)绾螖U(kuò)大范圍。因此,例如,如果我想在條件塊內(nèi)初始化變量,但又想擴(kuò)展范圍,以便可以在塊外使用相同的變量,那么在var情況下可以做什么。


答案是您可以使用:


var a = (RealType) null;

或(對(duì)此很明智)使用常規(guī)的類型聲明:


RealType a = null;

的var形式僅僅是語法糖:一個(gè)方便,以避免不必編寫特定的類型。當(dāng)您使用初始化時(shí),它根本不起作用null。推斷Object的類型a是沒有用的行為在絕大多數(shù)情況下。


例如,如果(假設(shè))為avar分配了null:


    var a = null;            

    if (something) {

        a = someMethodReturningRealType();

    }

    a.someRealTypeMethod();  // Compilation error ... because the inferred

                             // type is java.lang.Object.  Oops!!

這是編寫代碼的正確方法:


    RealType a = null;       // Just use a classic variable declaration

    if (something) {

        a = someMethodReturningRealType();

    }

    a.someRealTypeMethod();

我的示例只是分享我們可能需要將var聲明為null的所有地方。似乎沒有明確的方法可以做到這一點(diǎn)。


不。您不需要這樣做。您想這樣做...但是“想要”和“需要”不是同一回事。


而且,這是一個(gè)非?;镜膯栴},好像我們可以做到Object x = null;為什么我們不能做到var x = null;


因?yàn)镴LS禁止這樣做。就是這樣。故事結(jié)局。


如果您不喜歡它,那很好。但這不是討論論壇。無論如何,我們不是需要說服的人。


查看完整回答
反對(duì) 回復(fù) 2021-04-18
?
慕神8447489

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

從Oracle JDK 10頁面:


您不能只使用var語法來聲明沒有值的變量,也不能將var變量初始化為null。實(shí)際上,尚不清楚類型應(yīng)該是什么,因?yàn)樗赡艽蛩阌糜诤笃诔跏蓟?/p>


因此,基本上,您必須具體確定所需的數(shù)據(jù)類型,編譯器不能僅僅假定您想要的數(shù)據(jù)類型Object或任何其他類型。


因此,以下所有操作均會(huì)導(dǎo)致編譯失?。?/p>


var x;


var x = null;


var x = () -> {}


查看完整回答
反對(duì) 回復(fù) 2021-04-18
  • 3 回答
  • 0 關(guān)注
  • 218 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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