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)。

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é)局。
如果您不喜歡它,那很好。但這不是討論論壇。無論如何,我們不是需要說服的人。

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 = () -> {}
添加回答
舉報(bào)