Java中的通用函数

时间:2015-06-08 02:34:46

标签: java generics

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

public static<T> T foo(T... a)

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

public static T foo(T[] a)

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

3 个答案:

答案 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并返回StringT阻止了这一点。

如果您想限制可接受的类型,可以执行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'将匹配任何实际类型。它像一个外卡类型:)