我猜它可能是最好的开始与行为,我看:我传递到第二泛型方法可变参数,当失去的通用方法变量的类型
public class genericTest {
public static void main(String[] args) {
String str = "5318008";
printClass(str); // class java.lang.String
callPrintClass(str); // class java.lang.String
printClassVarargs(str); // class java.lang.String
callPrintClassVarargs(str); // class java.lang.Object
}
public static <T> void printClass(T str) {
System.out.println(str.getClass());
}
public static <T> void printClassVarargs(T ... str) {
System.out.println(str.getClass().getComponentType());
}
public static <T> void callPrintClass(T str) {
printClass(str);
}
@SuppressWarnings("unchecked")
public static <T> void callPrintClassVarargs(T str) {
printClassVarargs(str);
}
}
看着printClass()
和callPrintClass()
,似乎一切工作正常。 callPrintClass()
需要一个通用参数并将其传递。 printClass()
通过其正确的类型识别此变量,而不关心谁正在发送参数,然后按照它应该的操作并打印java.lang.String
。
但是,当我们尝试使用可变参数时,这停止工作。我期望printClassVarargs()
认识到它的参数类型为String[]
,很像没有可变参数的方法可以识别它的参数类型。也请注意,如果我直接拨打printClassVarargs()
(这非常高兴输出String
),但只有当它被callPrintClassVarargs()
调用时,才会发生这种情况,它忘记了它的参数类型并假定它获得了Object
。我也意识到我不得不在这里压制一个编译器警告,这通常会在我尝试抛出泛型时出现,但我不确定那里究竟发生了什么。
所以我的问题真的是两个。这种行为背后的原因是什么?这是类型擦除的一些后果,还是Java处理数组的方式?其次,有没有办法解决这个问题?
这当然只是一个简单的例子。我没有试图用这种方式打印类名,但最初在编写重载方法来连接数组时发现了问题。
我发现类似的问题:http://stackoverflow.com/questions/1817524/generic-arrays-in-java。 – 2012-07-16 09:41:27