【问题标题】:How to create generic primitive arrays?如何创建通用原始数组?
【发布时间】:2013-06-21 01:29:16
【问题描述】:

这是来自Two methods for creating generic arrays的以下问题。

给定两种方法,

@SuppressWarnings("unchecked")
static <T> T[] array1(final Class<T> elementType, final int size) {

    return (T[]) Array.newInstance(elementType, size);
}
static <T> T[] array2(final Class<T[]> arrayType, final int size) {

    return arrayType.cast(Array.newInstance(arrayType.getComponentType(), size));
}

这两种方法都适用于 Object 类型。

final Integer[] objectArray1 = array1(Integer.class, 0);
final Integer[] objectArray2 = array2(Integer[].class, 0);

当涉及到原语时,两个调用都不能编译。

// array1
final int[] primitiveArray1 = array1(int.class, 0);
GenericArray.java:12: error: incompatible types
        final int[] primitiveArray1 = array1(int.class, 0);
                                            ^
  required: int[]
  found:    Integer[]
1 error
// array2
final int[] primitiveArray2 = array2(int[].class, 0);
GenericArray.java:13: error: method array2 in class GenericArray cannot be applied to given types;
        final int[] primitiveArray2 = array2(int[].class, 0);
                                      ^
  required: Class<T[]>,int
  found: Class<int[]>,int
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Object
  where T is a type-variable:
    T extends Object declared in method <T>array2(Class<T[]>,int)
1 error

如何处理原始类型?

【问题讨论】:

  • 您使用的是哪个版本的 Java?
  • @Code-Guru:我没看到。他们似乎在问非常不同的事情。
  • @ruakh 我应该仔细看看 ;-(

标签: java arrays generics primitive


【解决方案1】:

试试这个

static <A> A array3(final Class<A> arrayType, final int size) 
{    impl omitted... }

final int[] primitiveArray3 = array3(int[].class, 0);

【讨论】:

    【解决方案2】:

    基元与泛型不兼容;比如不能创建List&lt;int&gt;int.class的类型是Class&lt;Integer&gt;而不是Class&lt;int&gt;。所以你描述的是不可能的。

    【讨论】:

      【解决方案3】:

      这是正常的方式:

      int[] foo = (int[])Array.newInstance(int.class, 5);
      

      正如 ruakh 所提到的,你不能使某些东西对原始类型通用,所以你必须以某种方式转换结果。

      【讨论】:

        【解决方案4】:

        您不能将原语与泛型一起使用。另一方面,您可以使用Integer[] 代替int[],并在必要时依靠自动(取消)装箱在intInteger 之间进行转换。

        【讨论】:

          【解决方案5】:

          您不能将原语与泛型一起使用,只能使用Objects;但是,您可以使用它们的包装器:IntegerCharacter 等。

          【讨论】:

            【解决方案6】:

            这工作并创建 int[]:

            final Object instance = Array.newInstance(Integer.TYPE, 0);
            

            【讨论】:

              猜你喜欢
              • 2011-07-01
              • 2014-10-02
              • 2021-11-02
              • 2011-05-13
              • 2021-05-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多