代码之家  ›  专栏  ›  技术社区  ›  Joshua

Java泛型

  •  5
  • Joshua  · 技术社区  · 17 年前

    为什么下面的内容比旧的铸造方法更好?

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

    VS

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

    5 回复  |  直到 14 年前
        1
  •  4
  •   oxbow_lakes    17 年前

    使用显式类型参数的另一个优点是允许使用 Proxy (在这种情况下) MyObj 需要 MyInterface )如果没有显式的类型参数,这是不可能的。

    您可以使用 代理 有很多原因(测试一个)

        2
  •  9
  •   Tim Frey    17 年前

    不能保证非泛型版本将返回“myobj”类型的对象,因此您可能会得到ClassCastException。

        3
  •  6
  •   Il-Bhima    17 年前

    在案例1中,如果没有ID为的对象,大多数实现良好的服务将能够返回空值。 someId 类型的 MyObj 找不到。此外,第一种情况使服务有可能有一些特定的逻辑来处理类型的类。 MyObji .

    在案例2中,除非您使用instanceof(如果可能,请避免),否则您将面临丑陋的风险 ClassCastException 你必须抓住和处理。

        4
  •  3
  •   Adam Paynter    17 年前

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

        5
  •  0
  •   PaulMurrayCbr    14 年前

    这并不好。可以说,除了在非常特殊的情况下,情况更糟。唯一需要的时间就是目标需要在类对象上调用newInstance()(etc)——工厂方法和东西。

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

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