2012-08-05 84 views
0

我见过设立ARRY列表如下创建一个ArrayList

private ArrayList<Student> students; //instance variable 

public CollegeCommunity()//constructor 

{ 
    students = new ArrayList<Student>(); 
} 

而且如下

ArrayList exampleArray = new ArrayList(); 

我明白为什么一个有一个实例变量/构造函数和对方只是简单地宣布,但我不确定为什么第一个包含<Student>而另一个没有<...> 两者之间的区别是什么?

回答

0

students正在使用所谓的泛型。泛型约束可以传递给ArrayList的类型。 exampleArray不指定类型。

3

不同之处在于被称为泛型的语言特性,这些特性在Java Tutorials trail here中有解释。

exampleArray使用泛型类ArrayListraw type宣布...

一个原始类型是一个泛型类或接口没有任何类型的参数的名称。

原始类型具有没有通用类型的信息,并因此是相同的类中的用途进行了介绍泛型之前。

另一方面,students使用通用parameterized type

A 泛型类型是通过类型参数化的泛型类或接口。

在于Generics are useful它们允许编译器有更多的类型信息,并且因此通过使其有效地推断类型,这是在执行强类型消除铸件用于缓解的编程。

原料ArrayList差不多相当于ArrayList<Object>。差异在有效Java中突出显示。

原始类型List和参数化类型List<Object>之间的区别是什么?简单地说,前者选择了泛型类型检查,而后者明确地告诉编译器它能够保存任何类型的对象。虽然可以将List<String>传递给List类型的参数,但不能将它传递给List<Object>类型的参数。泛型有子类型规则,List<String>是原始类型List的子类型,但不是参数化类型List<Object>的子类型。

因此,如果使用像List这样的原始类型,则会丢失类型安全性,但是如果使用参数化类型(例如List<Object>)则不会。

0

第一个ArrayList声明具有定义的泛型类型,而exampleArray没有。建议在可能的情况下使用仿制药以避免需要铸造:

E.g.

ArrayList<Student> students = ...; 
Student student = students.get(0); 

与:

ArrayList exampleArray = ...; 
Example example = (Example)exampleArray.get(0); 
0

的原因旁边有ArrayList<Students>是因为你需要指定ArrayList将举行什么类型的data。在这种情况下,这个人告诉java他想要一个ArrayList包含类的数据类型Students

没有这样做,它将无法正常工作。

0

区别仅仅是编译器的提示。声明new ArrayList<Student>() 强制实施这样的事实,即您将在指定的集合中只存储Student类的实例。这允许Java通过泛型保持strong type-safety

在运行时什么不会改变,因为Java有type erasure但这种强烈的约束将帮助您:编译器将引发错误时,你会尝试用不同的时间使用集合相比,你用声明的一个它。它被称为parametric polymorphism

原始声明new ArrayList()而不是实例上有对你要存储在它里面的物体的类型没有假设列表:这意味着一切都可以被存储,但你需要检索时,他们投退对象。此外,由于在编译时编译器将无法检查将尝试在集合中插入的内容,因此不会有任何类型安全性。

相关问题