2009-02-23 74 views
5

为什么看起来比以前的铸造方式更好?Java泛型

MyObj obj = someService.find(MyObj.class, "someId");

MyObj obj = (MyObj) someService.find("someId");

+1

谁说,这是更好? – Milhous 2009-02-23 19:44:33

回答

4

另一个优点,使用明确的类型参数是允许使用Proxy(在这种情况下MyObj将需要MyInterface)要实现的服务方法。没有明确的类型参数,这是不可能的。

您可以使用覆盖下Proxy原因是多方面的(测试一)

9

有没有保证非仿制药版本将返回一个类型的“MyObj中”的对象,所以你可能会得到一个ClassCastException。

6

在情况1中,如果没有找到类型为MyObj的编号为someId的对象,则大多数执行良好的服务将能够返回null。此外,第一种情况使得服务可以具有特定的逻辑来处理类型为MyObj的类。在案例2中,除非你使用instanceof(如果可能的话避免),那么你冒着一个丑陋的ClassCastException冒险,你将不得不赶上和处理。

3

为什么第一种方案更好的一个原因是find(Class,String)方法现在知道它的返回值分配给了什么。因此,它现在能够在内部进行任何相关的演员,而不是简单地希望返回正确的类型。例如,假设find方法在用"someId"调用时在内部查找String对象。方法可以具有将String转换为MyObj实例的策略。

0

这是不是更好。可以说它更糟糕,除非在特定的情况下。只有当你需要这样的事情时,目标需要在类对象 - 工厂方法和东西上调用newInstance()(等)。

如果您想保存电子,顺便说一句,这也将工作

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