Java中的通用函数

use*_*453 3 java generics

我对Java中的一些通用语法不太熟悉.
我遇到了一些像这样的代码:

public static<T> T foo(T... a)
Run Code Online (Sandbox Code Playgroud)

有人能够以简洁的方式解释它的含义吗?
这是否意味着foo()接受类型为T的数组并返回类型T?
为什么不是这样的语法?

public static T foo(T[] a)
Run Code Online (Sandbox Code Playgroud)

我查看了Oracle文档,但它们的示例似乎更容易理解:Oracle Generics

Thi*_*ilo 7

两件事情:

1)这是一个varargs方法,一种采用可变数量参数的方法.这与采用数组的方法不同(即使在引擎盖下使用数组实现).

您将此方法称为foo(a,b,c)(而不是foo(arrayWithABC)).

2)如果要使用泛型类型占位符T,则必须声明它.这正是第一次<T>做的.

public static T foo(T a)和之间的区别在于public static <T> T foo(T a)后者T为此方法的范围引入了"本地" .这意味着"方法返回任何类型参数的实例a".在第一个版本中,T需要是在其他地方声明的类型占位符(例如在类中作为整体)或类名.

由于<T>完全不受限制,您可以传递任何东西.泛型的作用是将返回值绑定到相同的类型.如果你有public static Object foo(Object a),你可以通过Integer并取回一个String.的T防止.

如果你想限制可接受的类型,你可以这样做public static <T extends Number> T foo(T a).