<t>在公共static <t> T addAndReturn(T元素,Collection <t>集合){</t> </t> </t>中有什么用?

时间:2009-11-03 16:19:58

标签: generics java-5

当我遇到这种通用方法时,我感到很困惑。

public static <T> T addAndReturn(T element, Collection<T> collection){
    collection.add(element);
    return element;
}

我无法理解为什么此方法需要<T>

另外,泛型方法和使用泛型语法的方法有什么区别?

5 个答案:

答案 0 :(得分:8)

> public static <T> T addAndReturn(T
> element, Collection<T> collection){
>     collection.add(element);
>     return element; }

<T>(在尖括号中)称为泛型类型参数,而直接位于方法名称之前的T是返回类型。您可能有一个泛型方法返回除泛型类型之外的其他类型。也许你想要一个方法来为一个集合添加一个元素(所以类型为T的对象),而不是返回添加的对象(也可以是T类型),你想要它返回集合中该项的索引,该索引始终为int。

返回类型不是泛型类型的示例方法签名:

public static <T> Integer addAndReturn(T element, Collection<T> collection)

与任何其他方法一样,泛型方法可以具有任何返回类型,包括泛型类型本身,任何其他类类型,任何基本或固有数据类型或void。您可能会混淆方法签名的两个不相关的部分,认为它们是依赖的,而不是。它们只是“依赖”,如果你使用T作为返回类型,返回值的类型是你在调用站点提供的泛型类型。

答案 1 :(得分:4)

使用object而不是T的替代方法将导致函数返回对象。

当它返回T时,您可以执行以下操作:

addAndReturn(myElement, col).SomeMethodOfMyElement();

如果addAndReturn返回了对象,则必须使用

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement();

需要显式转换,或

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;

需要两个语句而不是一个。


编辑:既然您的问题已经格式化,我看到其中一个参数是Collection<T>。在这种情况下,通用语法确保

addAndReturn(mySquare, collectionOfCircles);

返回编译时错误而不是运行时错误。


编辑:以防你的问题是关于<T>语法,而不是一般使用泛型:<T>告诉编译器方法中使用的T定义是不是某个类T,而是一个占位符,用于任何类“适合”该方法的特定调用。

答案 2 :(得分:-1)

这是一个泛型T只是一个占位符,用于返回更具体的类型。在您提供的情况下,T是您要添加到集合中的元素类型。

Collection<int> intCollection = new Collection();
int addedInt = addAndReturn(5, intCollection);
addedInt == 5;

由于它们都是T而不是T1或T2,因此它们必须是相同类型的对象,因为函数会向通用集合添加类型,因此显然需要单个类型

答案 3 :(得分:-1)

如果我们可以这么说,那么T用于多态性原因。 T是任何类型的类型。

也就是说,如果你来拥有一个Customer类,你可以使用上面提到的方法来处理你的用户类型Customer类。 T允许您放置任何您想要的类型。

T允许您将此通用方法用于您自己的用户定义类型,就像它对值类型或任何其他类型一样。 T成为元素参数中指定的类型。

答案 4 :(得分:-1)

此方法返回相同的输入element可能是因为实施者打算使用Fluent Interface类似的方式来提供更具可读性的API:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff();

Here你有一个关于Java泛型的很好的教程,我觉得这些教程完整且具有启发性。