【问题标题】:Generic array creation error通用数组创建错误
【发布时间】:2011-10-31 04:37:13
【问题描述】:

我正在尝试做这样的事情:-

public static ArrayList<myObject>[] a = new ArrayList<myObject>[2];

myObject 是一个类。我收到此错误:- 通用数组创建(箭头指向新的。)

【问题讨论】:

  • 公共静态 ArrayList[] a = new ArrayList[10];
  • 这不是重复!这个问题是关于“new E[n]”,而这个问题是“new Generic[n]”。完全不同!

标签: java arrays generics


【解决方案1】:

你不能有泛型类的数组。 Java 根本不支持它。

您应该考虑使用集合而不是数组。例如,

public static ArrayList<List<MyObject>> a = new ArrayList<List<MyObject>();

另一个“解决方法”是创建一个这样的辅助类

class MyObjectArrayList extends ArrayList<MyObject> { }

然后创建一个MyObjectArrayList 的数组。


这里是good article,说明为什么该语言不允许这样做。本文给出了以下示例,说明如果允许会发生什么:

List<String>[] lsa = new List<String>[10]; // illegal
Object[] oa = lsa;  // OK because List<String> is a subtype of Object
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[0] = li; 
String s = lsa[0].get(0); 

【讨论】:

  • 如果它可以编译,您将能够创建不一致的集合。 (数组不是这样工作的,而是依赖于在运行时抛出一个 ArrayStoreException。)我会为你挖掘一个关于它的链接......
  • 如果您尝试将文章中的示例转换为数组是 ArrayList,那么您会在此处收到错误:List&lt;Object&gt; oa = lsa; // Type mismatch: cannot convert from List&lt;List&lt;String&gt;&gt; to List&lt;Object&gt; 为什么不允许泛型数组进行相同的检查?您可以使用在该方法中失去一些向后兼容性的注释来激活它。
  • 在没有泛型的情况下同样的问题 ` String[] x = new String[10];对象[] y = x; y[1] = 10; //装箱字符串 z = x[1];`
  • 我看不出有什么区别:Integer [] integerArray=new Integer[20];对象 [] 对象数组 = 整数数组; objectArray[0]= "你好世界!"; integerArray[0].floatValue();此代码编译并在运行时抛出此异常: java.lang.ArrayStoreException: java.lang.String 为什么?
【解决方案2】:

如果您尝试声明泛型类的数组列表,您可以尝试:

public static ArrayList<MyObject> a = new ArrayList<MyObject>();

这将为您提供一个 myobject(大小为 10)的数组列表,或者如果您只需要一个大小为 2 的数组列表,您可以这样做:

public static ArrayList<MyObject> a = new ArrayList<MyObject>(2);

或者您可能正在尝试创建一个数组列表:

public static ArrayList<ArrayList<MyObject>> a = new ArrayList<ArrayList<MyObject>>();

虽然我不确定我最后说的是否正确......

【讨论】:

    【解决方案3】:

    你可以的

    public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList<?>[2];
    

    public static ArrayList<myObject>[] a = (ArrayList<myObject>[])new ArrayList[2];
    

    (前者可能更好。)两者都会导致未经检查的警告,您几乎可以使用以下命令忽略或抑制:@SuppressWarnings("unchecked")

    【讨论】:

      【解决方案4】:

      在我看来,您使用了错误类型的括号。不能定义泛型数组的原因是类型擦除

      另外,变量“a”的声明是脆弱的,它应该是这样的:

      List<myObject>[] a;
      

      当你可以使用接口时,不要使用具体类。

      【讨论】:

        【解决方案5】:

        创建泛型数组有一种比使用 List 更简单的方法。

        首先,让

        public static ArrayList<myObject>[] a = new ArrayList[2];
        

        然后初始化

        for(int i = 0; i < a.length; i++) {
             a[i] = new ArrayList<myObject>();
        }
        

        【讨论】:

        • 或者,为了避免原始类型,ArrayList&lt;myObject&gt;[] a = (ArrayList&lt;myObject&gt;[])new ArrayList&lt;?&gt;[2];
        • Using the raw type ArrayList like this will harm type safety。例如,您可以编写a[0] = new ArrayList&lt;unrelatedObject&gt;();,它会编译得很好。无论如何,这个问题与数组的内容无关,所以我认为初始化不相关。
        猜你喜欢
        • 2011-04-23
        • 2022-01-17
        • 1970-01-01
        • 2020-01-23
        相关资源
        最近更新 更多