对于集合,我们何时更喜欢使用Object类型,何时使用原始类型

时间:2015-02-05 14:54:21

标签: java generics collections types

例如。

ArrayList<int> al = new Arraylist<int>();

ArraList<Integer> al = new ArrayList<Ingeter>();

另外, 我见过这样的代码:

ArrayList al = new ArrayList();
System.out.println("Initial size of al: " + al.size());

// add elements to the array list
al.add("C");

ArrayList声明中省略类型。这是一个好习惯吗?

我是否应该总是显式声明类型,或者这是Java约定以尽可能省略事物?

4 个答案:

答案 0 :(得分:3)

你有点跳进未来。 : - )

目前,不允许集合上的原语(通常是基本类型的泛型),语句ArrayList<int> al = new Arraylist<int>();不会编译。

这是引入包装类型(如IntegerDouble等)的原因之一。有了它们,我们就可以在集合中存储数字(和boolean包裹在Boolean)值。

据我所知,计划在一些下一个平台版本中引入Generics over Primitive Types功能(最有可能在JDK10中,但时间将告诉它是否会被删除或将被实现)。 / p>

答案 1 :(得分:3)

在处理泛型时使用原始类型并不好。 另外正如其他海报所说,不可能使用原始类型作为泛型类型。

ArrayList<int> al = new Arraylist<int>();

不会编译。您必须使用整数框类

答案 2 :(得分:2)

使用java 5 +

时,应始终使用type

ArraList<Integer> al = new ArrayList<Ingeter>();

不编译

ArrayList<int> al = new Arraylist<int>();

仅适用于旧的Java版本。

ArrayList al = new ArrayList();

答案 3 :(得分:2)

在java1.5之前,你可以创建没有泛型的ArrayList ..比如

ArrayList a= new ArrayList();

这意味着您的数组列表可以包含任何对象。由于Object类是所有类的超类,因此您可以在其中插入任何Object。 但它有一个缺点..当你使用Object方法时,你必须强制转换get()

在Java 1.5及更高版本中,您可以为特定类型创建ArrayList

ArrayList<type> obj= new ArrayList<type>();

这确保了确保类型确保,并且您不必在从列表中获取时转换对象。

使用Java 1.5的集合 您可以存储ObjectObject的子类。您无法存储int等基元类型。 因此,为了在int中存储ArrayList,您必须在定义ArrayList时使用相应的包装类。

Java将使用称为autoboxing / outboxing的机制自动将int转换为IntegerIntegerint