(1) 在互联网上和StackOverflow上,有许多与普通和营利有关的特定问题的例子。 基本上,如果你有不同类型的争论:
<T> void foo(T... args);
在 Java,脂肪是合成糖,在编造时经历一种简单的“再写”:一种蒸气参数:<代码> X...被转换成X[]
的参数;每当有人呼吁采用这一加固方法时,汇编者收集了所有“可变的论据”,这些论点都包含在加固参数中,并创设了像new X[]{......(此处加插图)。 }
。
当弹性体类型具体如<代码>时,便能很好地发挥作用。 String.... 哪类变量如<代码> T...,它也在上发挥作用。 T
为这一呼吁的具体类型。 例如,如果上述方法属于类别<代码>的一部分。 Foo<T>,并附有。 Foo<String>
reference, 然后打电话foo
,因为我们现在知道T
:String。
然而,当<代码>T的“价值”是另一个类型参数时,它并不发挥作用。 在 Java,不可能建立一系列类型的参数组成部分(<>代码>new T[]{......})。 So Java 相反使用new Object[]{>}
(Object
为的上限)。 T
;如果上限有所不同,则不是<条码>(目标条码”),然后向您发出汇编警告。
因此,创建<代码>新目标[]而不是new T[]
或无论什么都是错误的? 简而言之, Java的阵列在运行时间知道其部件类型。 因此,通过阵列的物体在运行时将具有错误的成分类型。
也许最常用的救助办法,简单地说是为了在元素中注入活力,这并不是问题(不会对阵列的操作时间类型给予照顾),因此,这是安全的:
@SafeVarargs
final <T> void foo(T... args) {
for (T x : args) {
// do stuff with x
}
}
然而,对于取决于所通过阵列的操作时间组成部分的任何东西,都不会安全。 这里是不安全和失事的简单例子:
class UnSafeVarargs
{
static <T> T[] asArray(T... args) {
return args;
}
static <T> T[] arrayOfTwo(T a, T b) {
return asArray(a, b);
}
public static void main(String[] args) {
String[] bar = arrayOfTwo("hi", "mom");
}
}
这里的问题是,我们取决于<代码>args的类型,即T[]
,以便作为予以退回。 T[]
。 但实际而言,争论的类型不是T[
。
3) 如果贵国的方法有“<代码”的争论 T... (T为任何类型的参数),然后:
- Safe: If your method only depends on the fact that the elements of the array are instances of
T
- Unsafe: If it depends on the fact that the array is an instance of
T[]
视阵列的操作时间类型而定的物品包括:将其退回为T[]
,将其作为一个参数的论据通过T[]
,将阵列类型改为。
2) 上文提及的区别过于复杂,难以自动区分。