原始数组的自动装箱和可变参数系统之间似乎存在边缘情况。有没有一种干净(即不反射)的方式来解决这个问题?
例子:
public class Test {
class A<T> {
public void a(T... ts) {
System.out.println(ts.getClass().getCanonicalName() + " of " + ts[0].getClass().getCanonicalName() + " = " + Arrays.toString(ts));
}
}
public void test() {
// These all work fine - presumably all parameters are autoboxed.
new A().a(1, 2, 3);
new A().a(1.0, 2.0, 3.0);
new A().a(1L, 2L, 3L);
// You can even mix them up - which is unexpected.
new A().a(1.0f, 2.0d, 3L);
// Works fine - even though I get a "non-varargs call to varargs method with inexact argument type ..." hint.
new A().a(new Integer[]{1, 1});
// No hint - and doesn't do as intended.
new A().a(new int[]{1, 1});
// Works fine.
new A<Integer>().a(new Integer[]{1, 1});
}
public static void main(String args[]) {
try {
new Test().test();
} catch (Throwable t) {
t.printStackTrace(System.err);
}
}
}
印刷
java.lang.Object[] of java.lang.Integer = [1, 2, 3]
java.lang.Object[] of java.lang.Double = [1.0, 2.0, 3.0]
java.lang.Object[] of java.lang.Long = [1, 2, 3]
java.lang.Object[] of java.lang.Float = [1.0, 2.0, 3]
java.lang.Integer[] of java.lang.Integer = [1, 1]
java.lang.Object[] of int[] = [[I@4d815146]
java.lang.Integer[] of java.lang.Integer = [1, 1]
请注意, int[] 打印不正确 - 它似乎被装箱到Object[]
其第一个值为 my int[]
。其他一切似乎都很好。
我希望int[]
调用正确打印而不会破坏其他调用。
PS如果您可以通过反思来做到这一点,请务必发布。我只是不想使用它。