区别:<t> ReturnContainer test()和:<t> ReturnContainer <t> test()?</t> </t> </t>

时间:2010-09-23 11:01:06

标签: java generics

以下两种方法的签名有什么区别?

public static <T> ReturnContainer test(Class<T> incomingClass)
{
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>();
    ReturnContainer rc = new ReturnContainer(tupelo, incomingClass);
    return rc;
}

要求返回类型<T> ReturnContainer以上与<T> ReturnContainer<T>之间有什么区别?

public static <T> ReturnContainer<T> test(Class<T> incomingClass)
{
    List<TestTuple<T>> tupelo = new ArrayList<TestTuple<T>>();
    ReturnContainer rc = new ReturnContainer<T>(tupelo, incomingClass);
    return rc;
}

2 个答案:

答案 0 :(得分:3)

好吧,如果ReturnContainer是一个泛型类,我假设它来自你的例子,不建议使用像第一个例子中那样的原始类型,因为它不是类型安全的。

例如,您可能会有以下内容:

ReturnContainer<String> container = test(Integer.class);

这会起作用(但会产生警告),因为返回类型是原始类型。 然后,当你试图从容器中获取某些内容时,编译器会认为它是一个String,但它实际上是一个Integer,你会得到一个ClassCastException。

编辑:查看上一个问题后

你需要告诉我们ReturnContainer是否首先有一个类型参数,或者类的重点是什么。 <T>参数对于Lists或Maps之类的容器类很有用,因为它直接告诉您它包含的对象类型,而不是承载对象,并允许您在从容器中检索它们时将它们转换为任何对象。它们提供额外的安全性。您确定List<String>保证只包含字符串,而getadd方法只返回/接受字符串。如果您的容器具有类似的行为,那么它应该具有类型参数,您应该使用第二种方法。

答案 1 :(得分:0)

编辑以更好地回答您的问题,并删除了c#版本:)

通过返回ReturnContainer,您将提供有关返回的内部对象类型的信息。

通过仅传递有关传入类的信息,您不会提供有关ReturnContainer的信息,或者其中的元素 - 只是参数是T类型。

相关问题