来自null泛型类型的Java通用数组

时间:2011-01-21 23:07:10

标签: java generics

将Array.newInstance静态方法视为在Java中创建泛型类型数组的一种方法。 我没有看到怎么做是从null泛型类型参数创建一个泛型数组:

/**
* Creates and fills a generic array with the given item
*/
public static <T> T[] create(T item, int length)
{
   T[] result = (T[]) Array.newInstance(item.getClass(), length);

   for(int i = 0; i < length; i++)
      result[i] = item;

   return result;
}

当我打电话时,上述情况有效create(“abc”,10);我在数组的所有位置都得到一个长度为10的String []和“abc”。 但是,如何使空字符串参数返回长度为10的String数组并在所有位置返回null?

e.g。

String nullStr = null;
String[] array = create(nullStr, 10); // boom! NullPointerException

是否有一种方法可以在不使用其中一个成员的情况下获取“item”类(因为它为null)? 我知道我可以新建一个数组 String [] array = new String [10] ,但这不是重点。

由于

3 个答案:

答案 0 :(得分:3)

也许这很有用。

public static <T> T[] create(Class<T> clazz, int length)
{
   T[] result = (T[]) Array.newInstance(clazz, length);
   return result;
}

答案 1 :(得分:2)

正如您所指出的,您无法致电:

create(null, 10)

因为您的代码无法确定类型(最终会调用null.getClass() =&gt; NPE)。

你可以单独传递课程:

public static <T> T[] create(Class<T> type, int length, T fillValue)
{
   T[] result = (T[]) Array.newInstance(type, length);

   for(int i = 0; i < length; i++)
      result[i] = fillValue;

   return result;
}

// Some optional convenience signatures:

public static <T> T[] create(Class<T> type, int length) {
    return create(type, length, null);
}

public static <T> T[] create(T fillValue, int length) {
    if (fillValue == null) {
        throw new IllegalArgumentException("fillValue cannot be null");
    }
    return create(fillValue.getClass(), length, fillValue);
}

public static void main(String[] args) {
    String[] a = create(String.class, 10, null);
}

答案 2 :(得分:1)

那么,为什么不改变方法来取代Class对象,而只是直接传入String.class? Java无法获取null的类类型,因为它没有类类型!任何对象都可以为null。