为什么从另一个泛型方法调用的泛型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 []? [重复]的主要内容,如果未能解决你的问题,请参考以下文章