公共static <T> T addAndReturn(T元素,Collection <T>集合)中<T>的用法是什么{

Jeg*_*iya 14 generics java-5

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

public static <T> T addAndReturn(T element, Collection<T> collection){
    collection.add(element);
    return element;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么<T>这个方法需要.

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

Sam*_*ham 9

> public static <T> T addAndReturn(T
> element, Collection<T> collection){
>     collection.add(element);
>     return element; }
Run Code Online (Sandbox Code Playgroud)

<T>(在尖括号)被称为一般类型参数,而T直接前述方法名是返回类型.您可能有一个泛型方法返回除泛型类型之外的其他类型.也许你想要一个向集合添加元素的方法(所以类型的对象T),而不是返回添加的对象(也可以是类型T),你希望它返回集合中该项的索引,这将永远是一个int.

示例方法签名,其中返回类型不是泛型类型:

public static <T> Integer addAndReturn(T element, Collection<T> collection)
Run Code Online (Sandbox Code Playgroud)

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


Hei*_*nzi 4

另一种方法是使用 object 而不是 T,这会导致函数返回 object。

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

addAndReturn(myElement, col).SomeMethodOfMyElement();
Run Code Online (Sandbox Code Playgroud)

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

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement();
Run Code Online (Sandbox Code Playgroud)

需要显式强制转换,或者

addAndReturn(myElement, col);
myElement.SomeMethodOfMyElement;
Run Code Online (Sandbox Code Playgroud)

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


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

addAndReturn(mySquare, collectionOfCircles);
Run Code Online (Sandbox Code Playgroud)

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


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