24

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

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

我不明白为什么<T>需要这种方法。

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

4

5 回答 5

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

<T>在尖括号中)被称为泛型类型参数,而T直接在方法名称之前的是返回类型。您可能有一个泛型方法,它返回泛型类型以外的其他类型。也许您想要一个将元素添加到集合的方法(因此是 type 的对象T),而不是返回添加的对象(也是 type T),您希望它返回集合中该项目的索引,这将始终是一个 int。

返回类型不是泛型类型的示例方法签名:

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

与任何其他方法一样,泛型方法可以具有任何返回类型,包括泛型类型本身、任何其他类类型、任何基本或固有数据类型或 void。您可能会混淆方法签名的 2 个不相关部分,认为它们是依赖的,而实际上它们不是。它们只是“依赖”的,因为如果您确实使用 T 作为返回类型,则返回值的类型是您在调用站点提供的泛型类型。

于 2009-11-10T22:37:35.300 回答
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>语法而不是一般泛型的使用: The<T>告诉编译器T方法定义中使用的不是某个类 T 而是任何类“适合”的占位符方法的具体调用。

于 2009-11-03T16:27:53.947 回答
-1

此方法返回相同的输入element可能是因为实现者打算使用类似Fluent 接口的方式来提供更具可读性的 API:

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

在这里,您有一个关于 Java 泛型的很好的教程,我觉得它是完整且有启发性的。

于 2009-11-03T16:51:30.723 回答
-1

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

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

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

于 2009-11-03T16:33:21.353 回答
-1

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

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

由于它们都是 T 而不是 T1 或 T2 它们必须是相同类型的对象,因为显然需要单个类型,因为函数将类型添加到泛型集合

于 2009-11-03T16:29:48.617 回答