簡體   English   中英

Java泛型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM