【发布时间】:2014-09-13 04:20:38
【问题描述】:
为什么表达式?[] 是非法的?我不明白为什么它比T[] 更可疑。我知道通用数组创建存在问题,所以我明白为什么不允许使用 new T[] 和 new ?[3] 之类的东西,但我看不出 ?[] 有什么问题。例如,能够拥有像void method(?[] arr) 这样的方法签名会很好。这有什么问题?
另外,编写采用未知类型数组的方法的首选方法是什么?你应该使用
public void method(Object[] arr)
优先于
public <T> void method(T[] arr)
或者,如果类型参数只出现一次,您应该避免在方法签名中使用类型参数,这是否是常规规则的一个例外?
【问题讨论】:
-
如果您多次使用
T,则使用<T>很有用,例如public <T> T method(T[] arr, T foo)。 -
T是在类级别或函数级别声明的类型。?是一个通配符,它实际上从未被赋予特定值,因此它不是您可以使用的实际类型 -
我不明白这个问题。 “?”是用于定义类型参数的通配符,而不是类型参数本身的替代品,因此您不能在通常使用类型参数的地方使用问号!
-
也不允许有
void method(? param)。同样的原因:'?不是类型。 -
使用
List,您将传递一个类型,该类型在运行时解决。使用常规数组,您是在声明一个在编译时解析的类型。你不能声明一个通配符并期望它在编译时被解析,因此你得到的错误