本文介紹了ImmuableList.Builder()錯(cuò)誤?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我剛剛開(kāi)始學(xué)習(xí)番石榴,我注意到ImmutableList.builder()
有些奇怪。
這不能編譯:
List<String> iList = ImmutableList.builder().add("One").add("Two").build();
//Type mismatch: cannot convert from List<Object> to List<String>
這行得通:
List<String> iList = new ImmutableList.Builder<String>().add("One").add("Two").build();
我可以接受使用new ImmutableList.Builder<String>()
,但這是ImmutableList.builder()
的錯(cuò)誤嗎?
推薦答案
否,只需提供類型參數(shù)
List<String> iList = ImmutableList.<String>builder().add("One").add("Two").build();
這絕不是Guava中的錯(cuò)誤,它只是Java語(yǔ)言的一個(gè)特性/限制。編譯器無(wú)法從以前的方法調(diào)用或要將結(jié)果賦值到的變量的聲明中推斷build()
的返回類型。
Angelika Langerexplains這個(gè)
自動(dòng)類型參數(shù)推理。該方法的調(diào)用方式與常規(guī)方法一樣
非泛型方法,即不指定類型
爭(zhēng)論。在這種情況下,編譯器會(huì)自動(dòng)推斷類型
來(lái)自調(diào)用上下文的參數(shù)。
她在Why does the type inference for an instance creation expression fail?
中也給出了類似的例子
String s = new ArrayList<>().iterator().next(); // error
和狀態(tài)
在上面的示例中,發(fā)出錯(cuò)誤消息是因?yàn)樾碌?br /> -表達(dá)式new ArrayList<;>()沒(méi)有構(gòu)造函數(shù)參數(shù),它既不出現(xiàn)在賦值的右側(cè),也不顯示為
方法調(diào)用的參數(shù)。相反,它以鏈條的形式出現(xiàn)
方法調(diào)用的。這樣的鏈不是有效的類型推斷上下文。
這篇關(guān)于ImmuableList.Builder()錯(cuò)誤?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,