为什么从另一个泛型方法调用的泛型varargs方法返回Object []?

时间:2018-04-08 21:46:06

标签: java generics variadic-functions

我在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

1 个答案:

答案 0 :(得分:2)

你在问题​​中解释过自己。由于pickTwo()采用泛型,因此当它调用toArray()时,编译器不知道将哪个类传递给pickTwo(),然后在调用toArray()时使用。由于只能在运行时知道,因此您只需获得Object[Ljava.lang.Object;@70dea4e))

在编译时用toArray()显式调用int时,编译器可以确定返回类型是什么。