[英]Generic Collections in ArrayList
我试图以我的入门Java知识为基础,并涉足数据结构。
我正在看ArrayList
,但我不理解以下内容:
List<String> myList = new ArrayList<String>();
我用谷歌搜索了type parameter
但是我真的不明白为什么它是必需的,它在做什么(都包括调用构造函数和初始化变量); 如果有人可以简单地说给我解释,那就太好了。
谢谢
首先,我强烈建议您阅读Java泛型教程 。
其次,简单回答您的问题。 通过使用这样的通用类型,您将迫使编译器使用此实例对代码使用强类型检查。
如果您将列表定义为:
List myList = new ArrayList();
您将能够向其添加任何类型的对象,例如:
myList.add(new Integer());
myList.add(new Long());
通过将列表声明为:
List<String> myList = new ArrayList<String>();
您告诉编译器此列表将仅接受字符串,因此:
myList.add(new Integer());
将抛出编译时错误。
在Java 7中,您可以改用Diamond运算符(如果有帮助,可以将其视为逆类型推断),因此:
List<String> myList = new ArrayList<>();
这意味着你只能添加对象名单是类的String
或子类的String
。
与接口类相比,泛型通常对接口更有用。
在您的情况下,字符串的type参数表示ArrayList只能容纳String,不允许其他类型。 当您从ArrayList检索值时,它还可以确保输出为String并可以直接分配给String,这也有帮助。
使用此声明,您只需设置ArrayList的数据类型。 这样,您可以确保ArrayList是字符串数组
要理解这一点,您需要了解泛型在Java中的工作方式。 简而言之,该类型允许Generic ArrayList将每个元素转换为类型,然后将每个对象作为类型返回。
实现看起来像这样
public class ArrayList<T>{
public void add(T element)
public <T> get()
}
在您的示例中,这允许您将数组列表与字符串一起使用
在后台对象仍然是对象,但是每个读取/写入访问权限都在Castet中。
因此,您拥有类似类型安全性的东西(可以在此处阅读 ,可以将其破坏)。
泛型告诉编译器ArrayList只能包含String对象。
这是泛型的一个例子,但是在一段时间内你可能不知道泛型的细节-教程将告诉你如何编写像ArrayList
这样的类; 现在,您只需知道如何使用它。
在泛型之前,您需要声明如下列表:
List l = new ArrayList();
...,而List包含对象的集合。 Java运行时并不关心您放入哪种对象。
l.add(new Integer(3);
l.add("A String");
...并且Java运行时无法告诉您取出的对象是什么类型的,因此您必须强制转换它:
String s = (String) l.get(1); // throws a ClassCastException if object is not a String
这意味着各种编程错误的, 可以由编译器进行检测,如果只有语言能更好地表达自己,只能够在运行时被抓获。
因此,让我们添加一些内容,说明列表包含的内容:
List<String> l = new ArrayList<String>();
这意味着您只能add()
字符串add()
到列表中,并且从列表中get()
任何内容都将是一个字符串:
l.add(new Integer(1)); // compile error -- incompatible types
l.add("Hello"); // works
String s = l.get(0); // works, without casting
它适用于多态性。 因此,如果Apple
和Banana
是Fruit
子类:
List<Fruit> fruitList = new ArrayList<Fruit>();
fruitList.add(new Apple());
fruitList.add(new Banana());
如果查看List
的JavaDoc,您会看到它记录为List<E>
-其中E
是声明变量时插入的任何类型的占位符。
这些方法的记录方式相同: boolean add(E e)
, E get(int index)
等等。
泛型的主要用途是提供类型安全性。 如果不使用泛型,则对象将作为对象类型的引用出现。 在泛型之前,无法声明数组列表的类型,因此默认情况下,其add()方法采用类型对象。
对于简单的例如。 了解泛型如下
ArrayList<String> l=new ArrayList<String>();
l.add(null); // It will add type of string
在这里,使用泛型,您现在只能将字符串对象放入ArrayList中,这些对象将作为字符串类型的引用出现。
简而言之,使用泛型可以创建类型安全的集合,在编译时而不是运行时捕获更多问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.