2009-11-03 32 views
10

我感到困惑,当我遇到这类的一般方法。什么是公共静态<T>牛逼addAndReturn使用<T>(T元素,集合<T>集合){

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

我不明白为什么<T>在此方法中是必需的。

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

+0

请在提交问题前阅读格式指南。他们很难错过。 – Joe 2009-11-03 16:24:44

+1

尝试将代码示例格式化为代码 – NDM 2009-11-03 16:25:00

+0

@Joe,@Nicky De Maeyer:我修复了格式问题并删除了PS。 – Asaph 2009-11-03 16:26:27

回答

4

替代方法是,使用对象而不是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类而是一个占位符,用于任何适合于特定方法调用的类。

+1

感谢您的最近编辑评论。那是我的问题是关于。 我需要知道的是这个。 以下代码片段对编译器有什么影响吗?如果是这样,怎么样? 1.公共静态ŤaddAndReturn(集合集合){} 2.公共静态ŤaddAndReturn(集合集合){} – 2009-11-04 06:40:46

+0

对不起。我这次也错过了我的格式。 你能让我知道如何格式化我的代码? – 2009-11-04 06:41:33

+0

在第二个变体中,编译器认为您正在创建一个返回类T的函数,即文字“T”,如“class T {...}”中所示。在第一个变体中,您正在创建一个适用于* all *类的函数:如果您传递一个整数和一个集合,它将返回一个整数。 – Heinzi 2009-11-04 07:16:44

-1

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

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

因为都是T而不是T1或T2它们必须是作为一个单一的类型显然需要相同类型的对象,因为函数增加了一个类型到一个通用的集合

+2

因为这是java,我希望你的意思是集合 :) – penpen 2009-11-03 16:32:22

-1

T被用于多态的原因,如果我们可以这样说。 T是任何类型的类。例如,如果你有一个Customer类,你可以使用上面提到的方法来处理你的用户类型Customer类。 T允许你放置任何你想要的类型。

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

0

该方法返回相同的输入element可能是因为预期实施者使用Fluent Interface喜欢的方式提供一个更可读的API:

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

Here你对Java泛型,我觉得完全和启发性的一个很好的教程。

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

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

其中返回类型不是一般类型实施例方法的签名:

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

通用方法,像任何其他方法,可以具有任何返回类型,包括通用类型本身,任何其他类型,任何基本或固有的数据类型,或无效。你可能会混淆方法签名的两个无关部分,认为它们是依赖的,而当它们不是时。它们只是“从属”的,因为如果您使用,则使用T作为返回类型,返回值的类型是您在呼叫站点提供的通用类型。