[英]Java generics
為什么以下看起來比舊的鑄造方式更好?
MyObj obj = someService.find(MyObj.class, "someId");
與
MyObj obj = (MyObj) someService.find("someId");
無法保證非泛型版本將返回“MyObj”類型的對象,因此您可能會獲得ClassCastException。
在案例1中,如果沒有找到id為someId
類型為MyObj
對象,則大多數實現良好的服務都能夠返回null。 此外,第一種情況使得服務可以具有一些特定的邏輯,特別是對於MyObj
類型的MyObj
。
在第2種情況下,除非你使用instanceof(盡可能避免),否則你冒着一個丑陋的ClassCastException
,你必須抓住並處理它。
使用顯式類型參數的另一個好處是允許使用Proxy
實現服務方法(在這種情況下, MyObj
需要是MyInterface
)。 沒有明確的類型參數,這是不可能的。
出於多種原因,您可能會使用Proxy
(測試一個)
第一種情況更好的一個原因是find(Class,String)
方法現在知道它的返回值被分配給什么。 因此,它現在能夠在內部執行任何相關的強制轉換,而不是簡單地希望返回正確的類型。 例如,假設在使用"someId"
調用時, find
方法在內部定位String
對象。 find
方法可能有一個將String
轉換為MyObj
實例的策略。
這不是更好。 可以說它更糟糕,除非在非常具體的情況下。 只有你需要這種東西的時候,目標才需要在類對象上調用newInstance()(etc) - 工廠方法和東西。
如果你想節省電子,BTW,這也會起作用
MyObj obj = someService.find((Class<MyObj>) null, "someId");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.