我在Joshua Bloch的Effective Java书中遇到了以下代码,但我不明白为什么pickTwo
方法返回Object[]
?方法toArray
返回Integer[]
。那么为什么pickTwo
会返回Object[]
?我认为它应该返回Integer[]
。
此数组的类型由传递给方法的参数的编译时类型确定,编译器可能没有足够的信息来进行准确的确定。由于此方法返回其varargs参数数组,因此
pickTwo
将始终返回类型为Object[]
的数组。
public class JavaApplication52 {
public static void main(String[] args) {
System.out.println(toArray(1,2,3));
System.out.println(pickTwo(1,2,3));
}
static <T> T[] pickTwo(T a, T b, T c) {
switch (ThreadLocalRandom.current().nextInt(3)) {
case 0:
return toArray(a, b);
case 1:
return toArray(a, c);
case 2:
return toArray(b, c);
}
throw new AssertionError(); // Can't get here
}
static <T> T[] toArray(T... args) {
return args;
}
}
输出:
[Ljava.lang.Integer;@6d06d69c
[Ljava.lang.Object;@70dea4e
答案 0 :(得分:2)
你在问题中解释过自己。由于pickTwo()
采用泛型,因此当它调用toArray()
时,编译器不知道将哪个类传递给pickTwo()
,然后在调用toArray()
时使用。由于只能在运行时知道,因此您只需获得Object
([Ljava.lang.Object;@70dea4e
))
在编译时用toArray()
显式调用int
时,编译器可以确定返回类型是什么。