0

我想知道我是否有以下带有 Java 泛型的 ArrayList:

   int s=0;
    ArrayList<Integer> items=new ArrayList();
    for (int i=0;i<10;i++){
        items.add(i);
    }
    for (int j=0;j<items.size();j++){
        s=s+items.get(j);
    }

还是更好地使用这种原始形式?

    List listitem=new ArrayList();
    for (int i=0;i<10;i++){
        listitem.add(i);
    }
    for (int j=0;j<listitem.size();j++){
        s=s+(int)listitem.get(j);
    }
    System.out.println(s);

我的意思是我已经读过,当使用泛型出现变量的拆箱和装箱问题时,即从一种原始类型更改为对象。那么推荐哪一款呢?在什么情况下,仿制药将是最佳选择?

谢谢

4

5 回答 5

9

您几乎应该在现代 Java 中使用原始形式。有几个地方很难不去,但总的来说这是一个坏主意。

在第二个片段中使用 rawListArrayListtypes 绝不会阻止装箱 - 它只会降低类型安全性。在通用版本中,您不需要强制转换为,int因为编译器知道列表必须只包含Integer引用或空值;在原始形式中,没有编译时保证。没有什么可以阻止您向列表中添加完全不同类型的引用(例如字符串)。

于 2013-09-07T15:57:43.923 回答
3

我读过,当一个人使用泛型时,会出现变量的拆箱和装箱问题,从一种原始类型变为对象。

错误的。在这两个示例中,您都进行了自动装箱和自动装箱;它与泛型无关,而是在需要对象的情况下使用原语。

泛型版本更好,因为它检查您没有将意外类型的对象添加到列表中。

于 2013-09-07T15:58:37.730 回答
2

在我看来,泛型总是更好,因为您可以更加确定您的代码将按预期工作,因为错误的输入可以被编译器发现。例如:

List rawList = new ArrayList();
rawList.add(new Integer(2));
rawList.add("Howdy");
for(int i = 0; i < rawList.size(); i++)
{
    String listItem = (String) rawList.get(i); //java.lang.ClassCastException on 0
}

上面的代码可以编译,但由于不正确的转换会在运行时导致异常,但是下面的代码将不会编译并防止你犯这种错误:

List<String> gernericList = new ArrayList<>();
gernericList.add(new Integer(2)); //Compiler error: no suitable method found for add(Integer)
gernericList.add("Howdy");
于 2013-09-07T15:58:03.097 回答
0

我更喜欢使用泛型,这样您就可以避免由于强制转换而发生的意外运行时异常,因为没有泛型您可以将不同的对象存储在同一个集合中

于 2013-09-07T15:58:54.503 回答
0

在这两种情况下,您的示例都会发生装箱和拆箱,始终使用数据结构对象,因此将发生到原始类型的转换。你可以看看像 MutableInteger 这样的类,它可以避免程序在每次迭代时都创建一个对象,因为原始类型是作为对象的属性处理的。

于 2013-09-07T16:01:23.470 回答