我对Java中的一些通用语法不是很熟悉 我遇到了一些像这样的代码:
public static<T> T foo(T... a)
有人能够以简洁的方式解释它的含义吗?
这是否意味着foo()接受类型为T的数组并返回类型T?
为什么不是这样的语法?
public static T foo(T[] a)
我查看了Oracle文档,但他们的示例似乎更容易理解:Oracle Generics
答案 0 :(得分: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)
之间的区别在于后者引入了一个&#34; local&#34; T
表示此方法的范围。这意味着&#34;方法返回的任何类型参数a
具有&#34;的实例。在第一个版本中,T
需要是在其他地方声明的类型占位符(例如在类中作为整体)或类名。
由于<T>
完全不受限制,您可以传递任何内容。泛型的作用是将返回值绑定到相同的类型。如果您刚刚public static Object foo(Object a)
,则可以传入Integer
并返回String
。 T
阻止了这一点。
如果您想限制可接受的类型,可以执行public static <T extends Number> T foo(T a)
。
答案 1 :(得分:0)
class Foo {
static let CONSTANT = "hello"
func bar() -> String {
let CONSTANT = "bye"
return CONSTANT // I know which one! Thanks Swift!
}
}
println(Foo.CONSTANT)
println(Foo().bar())
表示方法的可变数量的T类型对象参数,而
T... a
表示T对象数组的单个参数
答案 2 :(得分:0)
这意味着类型'T'将匹配任何实际类型。它像一个外卡类型:)