当我遇到这种通用方法时,我感到很困惑。
public static <T> T addAndReturn(T element, Collection<T> collection){
collection.add(element);
return element;
}
我无法理解为什么此方法需要<T>
。
另外,泛型方法和使用泛型语法的方法有什么区别?
答案 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)
也就是说,如果你来拥有一个Customer类,你可以使用上面提到的方法来处理你的用户类型Customer类。 T允许您放置任何您想要的类型。
T允许您将此通用方法用于您自己的用户定义类型,就像它对值类型或任何其他类型一样。 T成为元素参数中指定的类型。
答案 4 :(得分:-1)
此方法返回相同的输入element
可能是因为实施者打算使用Fluent Interface类似的方式来提供更具可读性的API:
addAndReturn(myElement, col).doElementStuff().doOtherElementStuff();
Here你有一个关于Java泛型的很好的教程,我觉得这些教程完整且具有启发性。