【发布时间】:2014-10-28 14:57:13
【问题描述】:
(这里我将使用 T 来指代泛型参数,用于参数化类。)
我读到T... 用作参数时是堆污染的潜在来源的原因是编译器对正常(不允许T[] 数组)规则进行了例外处理,并允许T... (这是可变参数,因此通常会在内部通过可变参数规则转换为T[],除非泛型不允许这样做)作为参数,通过在内部实现它就好像它是原始类型一样,将其转换为Object[] 代替。
所以我写了一些代码来验证这一点,把这个概念牢牢地印在我的记忆中。
我将T...t 作为方法的参数,然后将System.out.println'd t.getClass[]。我希望得到Object[] 的课程,但我得到了T[] 的课程。
因此,编译器似乎在内部将T...t 转换为T[],而不是Object[]。
例如
public class MyClass<T>{
public void method(T...t)
{
System.out.println(t.getClass().getName()); //for MyClass<String>, this gives me
//[Ljava.lang.String
}
我在这里缺少什么?如果编译器没有在内部将泛型 varargs 参数转换为 Object[],它如何失去类型安全性并成为堆污染的潜在来源?
【问题讨论】:
-
你是怎么调用这个方法的?
method("string", "another");? -
是的。 MyClass
mc = new MyClass (); mc.method("what","the","something"); -
如果去掉类型注解(只是
MyClass mc)会变成Object[]吗?
标签: java generics variadic-functions