在 public static <T> T addAndReturn(T element, Collection<T> collection) 中,<T> 的作用是什么?

25
我在遇到这种通用方法时感到困惑。
public static <T> T addAndReturn(T element, Collection<T> collection){
    collection.add(element);
    return element;
}

我不理解为什么这个方法需要使用<T>

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


在提交问题之前,请阅读格式指南。它们很难被忽略。 - Joe
1
请尝试将您的代码示例格式化为代码。 - NDM
@Joe,@Nicky De Maeyer:我已经解决了格式问题并删除了PS。 - Asaph
2
问题应该是:...为什么需要<T>...有编辑权限的人可以修复吗? - Heinzi
5个回答

21
> public static <T> T addAndReturn(T
> element, Collection<T> collection){
>     collection.add(element);
>     return element; }
<T>(尖括号中的)被称为通用类型参数,而直接位于方法名称之前的T是返回类型。您可能有一个通用方法,它返回与通用类型不同的某些其他类型。也许您想要一个将元素添加到集合中的方法(因此是T类型的对象),而不是返回已添加的对象(这也将是T类型的),您希望它返回该项目在集合中的索引,该索引始终为int类型。
下面是一个示例方法签名,其中返回类型不是通用类型:
<T> int addElement(T element, List list)
public static <T> Integer addAndReturn(T element, Collection<T> collection)

通用方法与其他方法一样,可以具有任何返回类型,包括泛型本身、任何其他类类型、任何基本或固有数据类型或void。当你认为它们是相关联的时候,你可能会混淆方法签名的两个不相关部分。在这种情况下,它们只是“相关”的意思是,如果您使用T作为返回类型,则返回值的类型是您在调用站点提供的通用类型。


4

使用 object 而不是 T 作为返回值类型,将导致函数返回 object。

当它返回 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,而是一个占位符,用于特定调用该方法的任何类“适合”。


1
感谢您上次的编辑评论。这正是我的问题所在。我只需要知道这个。以下代码片段对编译器有任何影响吗?如果有,它会产生什么影响?
  1. public static <T> T addAndReturn(Collection<T> collection){ }
  2. public static T addAndReturn(Collection<T> collection){ }
- Jegan Kunniya
抱歉,这次我错过了格式。你能告诉我如何在这里格式化我的代码吗? - Jegan Kunniya
在第二种情况下,编译器认为您正在创建一个返回类T的函数。字面意思上的“T”,就像“class T { ... }”一样。在第一种情况下,您正在创建一个适用于所有类的函数:如果您传递一个整数和一个集合<Integer>,它将返回一个整数。 - Heinzi

-1

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

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

由于它们都是 T 而不是 T1 或 T2,显然需要一个单一类型的对象作为要求,因为该函数将类型添加到通用集合中。


2
由于这是Java,我希望你指的是Collection<Integer> :) - penpen

-1

这个方法返回相同的输入元素,可能是因为实现者打算使用类似流畅接口的方式来提供更易读的API:

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

这里,你可以找到一份我认为很全面而且很有启发性的Java泛型教程。


-1

T被用于多态的原因,如果我们这样说的话。T是任何类型的类Type。

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

T将允许你为自己定义的用户类型使用这个通用方法,就像它为值类型或任何其他类型做的那样。T成为元素参数中指定的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接