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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么从另一个泛型方法调用的泛型varargs方法返回Object []? [重复]相关的知识,希望对你有一定的参考价值。

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

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

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

以上是关于为什么从另一个泛型方法调用的泛型varargs方法返回Object []? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

请教关于java的泛型方法

请教关于java的泛型方法

在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#

Java的泛型方法概念原则

模拟任何给定类型参数的泛型方法调用

如何调用有界JAVA的泛型参数化方法?