??當(dāng)你使用泛型編程時止吁,你將看到許多編譯警告:未檢查的強(qiáng)制轉(zhuǎn)換警告佳窑,未檢查的方法調(diào)用淋硝,未檢查的參數(shù)化vararg類型警告雹熬,以及未檢查的轉(zhuǎn)換警告。 使用泛型獲得的經(jīng)驗越多谣膳,得到的警告就越少竿报,但是不要期望新編寫的代碼能夠干凈地編譯。
??許多未檢查的異常很容易消除继谚。比如烈菌,假設(shè)你意外地編寫這段聲明:
Set exaltation = new HashSet();
編譯器將會溫柔地提醒你哪里錯了:
??然后你可以根據(jù)提示更正,從而警告消失。請注意芽世,你實際上不必指定類型參數(shù)挚赊,只需要表明它與Java7中引入的菱形操作符(<>)一起存在。編譯器將會正確推斷實際的類型參數(shù)(在這種情況下济瓢,類型是Lark):
Set exaltation = new HashSet<>();
??
如果你不能消除一個警告荠割,但是你可以證明引發(fā)警告的代碼是類型安全的,那么(只有在那個時候)使用@Suppress Warnings("uncheckded")注釋來抑制警告葬荷。如果你沒有在第一時間證明代碼是類型安全的就抑制警告了涨共,你就給了自己一個錯誤的安全感纽帖。代碼可以編譯而不發(fā)出任何警告宠漩,但是它仍然可以在運(yùn)行時拋出ClassCastException。但是懊直,如果你忽略了你知道是安全的未經(jīng)檢查的警告(而不是抑制它們)扒吁,那么你將不會注意到什么時候出現(xiàn)了新的警告,它代表了一個真正的問題室囊。新的警告將在你沒有沉默的所有虛假警報中消失
??SuppressWarnings注解可以在任何聲明上使用雕崩,從一個局部的本地變量聲明到一整個類。始終在最小范圍中使用SuppressWarnings注解融撞。通常盼铁,這將是一個變量聲明或一個非常小的方法或構(gòu)造方法。永遠(yuǎn)別再一整個類中使用SuppressWarnings尝偎。這么做會掩蓋關(guān)鍵的警告饶火。
??如果你發(fā)現(xiàn)自己在多行長的方法或構(gòu)造方法上使用了SuppressWarnings注解,你可以將其轉(zhuǎn)移到局部變量聲明中致扯。你可能需要聲明一個新的局部變量肤寝,但是這是值得的。例如抖僵,考慮這個toArray方法鲤看,它來自ArrayList。
??如果你編譯ArrayList耍群,該方法將會生成這個警告:
??在return語句上添加SuppressWarnings注解是非法的义桂,因為它不是一個聲明 [JLS, 9.7]你可能會嘗試將注釋放在整個方法上,但是不要這么做蹈垢。相反澡刹,聲明一個局部變量以保存返回值并注釋其聲明,如下所示:
??生成的方法可以干凈地編譯耘婚,并最小化未檢查的警告被抑制的范圍罢浇。
??每次你使用@SuppressWarnings(“unchecked”)注解,需要添加注釋說明為什么這么做是安全的。浙江幫助別人理解代碼嚷闭,更重要的是攒岛,它將降低有人修改代碼的可能性,而導(dǎo)致計算變得不安全胞锰。如果你覺得很難寫出這樣的注釋灾锯,那就繼續(xù)思考。你可能最終會發(fā)現(xiàn)未經(jīng)檢查的操作畢竟是不安全的嗅榕。
??總之顺饮,未經(jīng)檢查的警告是重要的。不要忽視它們凌那。每個未檢查警告代表了一個在運(yùn)行時潛在的ClassCastException危險兼雄。盡你最大的努力來消除這些警告。如果你不能消除未經(jīng)檢查的警告帽蝶,并可以證明引發(fā)該警告的代碼是類型安全赦肋,請在盡可能窄的范圍內(nèi)使用@SuppressWarnings("unChecking")注解來抑制警告。并在注釋中記錄你決定抑制警告的理由励稳。
本文寫于2019.6.7佃乘,歷時1天