将原始int数组类(int [] .class)传递给期望Class <t []>无法编译的泛型方法

时间:2015-05-26 21:35:04

标签: java arrays generics primitive

我有以下代码:

public class Test {

    private Map<String, Object> delegate;

    public Test(Map<String, Object> delegate) {
        this.delegate = delegate;
    }

    public <T> T[] getValueAsArray(String key, Class<T[]> arrayClz) {
        T[] ret = null;
        Object val = delegate.get(key);
        if (val != null && arrayClz != null && arrayClz.isInstance(val)) {
            ret = (T[]) val;
        }
        return ret;
    }

    public static void main(String[] args) {
        Map<String, Object> delegate = new HashMap<>();
        int[] intArray = new int[3];
        intArray[0] = 1;
        intArray[1] = 2;
        intArray[2] = 3;
        delegate.put("intArray", intArray);

        Integer[] integerArray = new Integer[3];
        integerArray[0] = 1;
        integerArray[1] = 2;
        integerArray[2] = 3;
        delegate.put("integerArray", integerArray);

        Test test = new Test(delegate);
        //int[] a = test.getValueAsArray("intArray", int[].class);
        //System.out.println(Arrays.toString(a));
        Integer[] b = test.getValueAsArray("integerArray", Integer[].class);
        System.out.println(Arrays.toString(b));
    }

}

如果我从上面的类取消注释以下代码,它就不会编译。

    //int[] a = test.getValueAsArray("intArray", int[].class);
    //System.out.println(Arrays.toString(a));

它出现以下错误:

Error:(44, 31) java: method getValueAsArray in class com.jpmorgan.cu.collections.Test cannot be applied to given types;
  required: java.lang.String,java.lang.Class<T[]>
  found: java.lang.String,java.lang.Class<int[]>
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): java.lang.Object

有人可以解释为什么这不起作用?我假设数组是Object,所以int []和Integer []是不同的,但都是对象。 使这个方法适用于原始数组和对象数组的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

int[]是参考类型。 Integer[]是引用类型。 int是原始类型。 Integer是参考类型。

T[]描述了一种数组类型,其中组件类型是泛型类型T,在某些时候被绑定。

如果你打电话

Integer[] b = test.getValueAsArray("integerArray", Integer[].class);

您正试图将Integer绑定到T。这将起作用,因为Integer是一个引用类型,可以与无界泛型类型变量T一起使用。

但如果你打电话

test.getValueAsArray("integerArray", int[].class);

您正试图将int绑定到T。这不起作用,因为泛型类型仅适用于引用类型,int是基本类型。