【问题标题】:Two methods for creating generic arrays创建泛型数组的两种方法
【发布时间】:2013-06-20 03:28:12
【问题描述】:

我学习了以下两种创建泛型数组的方法。

一个是

@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));
}

哪个更好?它们(内部)相同吗?真的有任何情况是错误的吗?

【问题讨论】:

标签: java arrays generics


【解决方案1】:

在幕后,这两者实际上做了同样的事情,除了在选项 1 中您传递 T 的类对象和在选项 2 中您传递 T[] 的类对象。

我更喜欢选项 1,因为它更短且更易于阅读。再说一次,它与添加演员表的Array.newInstance 相同,所以我不确定您的方法是否增加了很多价值。 :-)

【讨论】:

    【解决方案2】:

    请注意,第一个不是类型安全的。例如,以下会导致 ClassCastException:

    array1(int.class, 5);
    

    【讨论】:

    • 检查并确认。两种方法都不会为原始类型编译事件。
    • @JinKwon:不,第一个编译并抛出异常。第二个不编译,并且是类型安全的。
    • 如果分配给 int[] 变量,则不会编译
    【解决方案3】:

    另一种(更好的)创建泛型数组的方法

    @SafeVarargs
    static <E> E[] newArray(int length, E... array)
    {
        return Arrays.copyOf(array, length);
    }
    
    
    Integer[] ints = newArray(10);
    
    String[] strings = newArray(10); 
    

    【讨论】:

    • 请注意,如果调用者本身在泛型范围内并且没有将 T 解析为具体类型,这将失败。
    • 只是因为擦除:) 并且array1/array2() 也存在同样的问题。
    • 这不是因为他们使用Class 类型标记和反射来解决擦除问题。
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多