【问题标题】:Java generic type with arrays带有数组的 Java 泛型类型
【发布时间】:2013-03-19 15:31:43
【问题描述】:

我无法为此正确编写通用方法:

private int [] loadIntArray(String key, int [] defaultArray) {
    int [] array = new int [4];
    for( int index=0; index<4 ; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}

这是我写的:

private <T[]> loadArray(String key, <T[]> defaultArray) {
    <T[]> array = new <T[LEVELS]>;
    for( int index=0; index<4 ; index++) {
        array[index] = sp.getInt(key + index, defaultArray[index]);
    }
    return array;
}

但它不能编译。
我收到几个错误,“缺少方法的返回类型”,“私有令牌后需要类型”。

正确的写法是什么?

【问题讨论】:

    标签: java android generics


    【解决方案1】:

    为了实现这一点,您必须在方法中添加 class parameter

    Class<T> type
    

    您的方法现在如下所示

     private <T> T[] loadArray(Class<T> type, String key, T[] defaultArray) {
          T[] array = (T[]) Array.newInstance(type, defaultArray.length);
          for (int index = 0; index < array.length; index++) {
             array[index] = sp.getInt(key + index, defaultArray[index]);
          }
          return array;
       }
    

    问题后更新:
    对该方法的调用会是什么样子? (例如对于类型“int”)?

    创建 Pair 对象时,不能用原始类型替换类型参数 K 或 V:

    Pair&lt;int, char&gt; p = new Pair&lt;&gt;(8, 'a'); // 编译时错误 您只能将非原始类型替换为类型参数 K 和 V:

    Pair<Integer, Character> p = new Pair<>(8, 'a');
    

    一种可能的解决方法
    (以通用方式传递它并将其保留为原始数组的唯一方法是作为对象。)

    Object a[]= {1,2,3};
    loadArray(Object.class, "test", a);
    

    或者你可以使用非原始类型(整数)

    Integer a[]= {1,2,3};
    loadArray(Integer.class, "test", a);
    

    【讨论】:

    • 如何调用此方法? (例如对于类型“int”
    • 以通用方式传递它并将其保留为原始数组的唯一方法是作为对象。
    • 谢谢,我从这里拿走!
    【解决方案2】:

    您将返回 T 类型的数组,而不是特定类型的 T[]

    这将更加朝着您想要的方向发展。

    private <T> T[] loadIntArray(String key, T[] defaultArray) {
        T[] array = new T[4]; // Need more info to correct this
        for (int index = 0; index < 4; index++) {
            array[index] = sp.getInt(key + index, defaultArray[index]);
        }
        return array;
    }
    

    【讨论】:

    【解决方案3】:

    假设defaultArray 永远是nil 并且永远是组件类型T 的数组,您可以使用它的类型来构造新数组:

    import java.lang.reflect.Array;
    
    private <T> T[] loadIntArray(String key, T[] defaultArray) {
        T[] array = (T[])Array.newInstance(defaultArray.getClass().getComponentType(), 4);
        for (int index = 0; index < 4; index++) {
            array[index] = sp.getInt(key + index, defaultArray[index]);
        }
        return array;
    }
    

    但是请注意,如果defaultArray 的运行时类型是T 的某个子类型的数组,这将不起作用。这将导致ArrayStoreException

    【讨论】:

      【解决方案4】:

      首先,方法签名应如下所示:

      private <T> T[] loadArray(String key, T[] defaultArray)
      

      【讨论】:

        【解决方案5】:

        这是 OP。
        虽然这不是标记的答案,但我想发布最终编译的代码,以便那些想要看到它的人。

        其他答案中没有提到的一件重要的事情是 Java 泛型不支持仅原始类型(int、float、...)的对象。所以我不得不将我的数组改为 Integer 和 Float。

        private <T> void loadArray(final T[] array, final String key, final T[] defaultArray) {
            int count = array.length;
            for( int index = 0; index < count; index++ ) {
                //if( array[index] instanceof PointF ) {
                if( array instanceof PointF[] ) {
                    PointF element = new PointF();
                    element.x = sp.getFloat(key + index, (Float) defaultArray[index]);
                    element.y = sp.getFloat(key + index, (Float) defaultArray[index]);
                    array[index] = (T) element;
                //} else if( array[index] instanceof Float ) {
                } else if( array instanceof Float[] ) {
                    Float element = sp.getFloat(key + index, (Float) defaultArray[index]);
                    array[index] = (T) element;
                //} else if( array[index] instanceof Integer ) {
                } else if( array instanceof Integer[] ) {
                    Integer element = sp.getInt(key + index, (Integer) defaultArray[index]);
                    array[index] = (T) element;
                }
            }
        }
        

        编辑
        事实证明,如果数组有维度,但没有初始化,

        array[index] instanceof Integer  
        

        返回false,所以我把测试改成

        arrray instanceof Integer[]  
        

        即使数组元素是null,它也会返回true

        【讨论】:

          猜你喜欢
          • 2017-10-06
          • 2011-06-13
          • 1970-01-01
          • 1970-01-01
          • 2011-06-11
          • 1970-01-01
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多