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

问题描述 投票:1回答:1

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

OUTPUT:

[Ljava.lang.Integer;@6d06d69c
[Ljava.lang.Object;@70dea4e
java generics variadic-functions
1个回答
2
投票

你已经在你的问题中解释了自己。由于pickTwo()采用泛型,当它调用toArray()时,编译器不知道将什么类传递给pickTwo()然后在调用toArray()时使用。因为那只能在运行时知道,你只需要获得Object[Ljava.lang.Object;@70dea4e))

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

© www.soinside.com 2019 - 2024. All rights reserved.