当我遇到这种通用方法时,我感到困惑.
public static <T> T addAndReturn(T element, Collection<T> collection){
collection.add(element);
return element;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么<T>这个方法需要.
另外,泛型方法和使用泛型语法的方法有什么区别?
> 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作为返回类型,返回值的类型为你提供在调用现场泛型类型.
另一种方法是使用 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 的类的占位符方法的具体调用。