Java泛型

5
为什么以下方式被认为比旧的强制转换方式更好呢? MyObj obj = someService.find(MyObj.class, "someId"); 相比之下: MyObj obj = (MyObj) someService.find("someId");

1
谁说这个更好? - Milhous
5个回答

9

不能保证非泛型版本会返回'MyObj'类型的对象,因此可能会出现ClassCastException异常。


6
在情况1下,大多数实现良好的服务都能够返回null,如果找不到类型为MyObj且id为someId的对象。此外,第一种情况使得服务可以具有特定于处理MyObj类型类的逻辑。
在情况2下,除非您使用instanceof(尽可能避免),否则您将冒着丑陋的ClassCastException风险,而您必须捕获和处理它。

4
使用显式类型参数的另一个优点是允许使用代理实现服务方法(在这种情况下,MyObj 需要是 MyInterface)。如果没有显式类型参数,则不可能实现此功能。
您可能出于许多原因在底层使用代理(例如测试)。

3

第一种方案更好的原因之一是,find(Class,String) 方法现在知道它的返回值被分配到哪里了。因此,它现在能够在内部执行任何相关的强制类型转换,而不是简单地希望正确的类型被返回。例如,假设在使用 "someId" 调用 find 方法时,它在内部定位到一个 String 对象。那么,find 方法可能有一个将 String 强制转换为 MyObj 实例的策略。


0

这并不更好。可以说除了非常特定的情况外,它更糟糕。只有在目标需要在类对象上调用newInstance()(等等)时才需要这种东西 - 工厂方法等。

顺便说一句,如果你想节省电子,这也可以工作。

MyObj obj = someService.find((Class<MyObj>) null, "someId");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接