我对Java中的一些通用语法不太熟悉.
我遇到了一些像这样的代码:
public static T foo(T... a)
有人能够以简洁的方式解释它的含义吗?
这是否意味着foo()接受类型为T的数组并返回类型T?
为什么不是这样的语法?
public static T foo(T[] a)
我查看了Oracle文档,但它们的示例似乎更容易理解:Oracle Generics
解决方法:
两件事情:
1)这是一个varargs方法,一种采用可变数量参数的方法.这与采用数组的方法不同(即使在引擎盖下使用数组实现).
您将此方法称为foo(a,b,c)(与foo(arrayWithABC)相反).
2)如果要使用泛型类型占位符T,则必须声明它.这正是第一个< T>确实.
公共静态T foo(T a)和公共静态< T>之间的差异. T foo(T a)是后者为该方法的范围引入了“局部”T.这意味着“方法返回任何类型参数的实例”.在第一个版本中,T需要是在其他地方声明的类型占位符(例如在类中作为整体)或类名.
由于< T>是完全不受限制的,你可以传递任何东西.泛型的作用是将返回值绑定到相同的类型.如果您只有公共静态Object foo(Object a),则可以传入一个Integer并返回一个String. T阻止了这一点.
如果你想限制可接受的类型,你可以做公共静态< T extends Number> T foo(T a).
标签:java,generics
来源: https://codeday.me/bug/20190727/1558430.html