java - 在 ArrayList 上的何处指定类型参数

标签 java generics

<分区>

两边casting有什么区别:

List <String>myNumbers = new ArrayList<String>();

对比:

List <String>myNumbers = new ArrayList();

和:

List myNumbers = new ArrayList<String>();

最佳答案

第一个示例是类型安全的,意思是如果您尝试添加除 String 以外的任何内容对象进入 myNumbers list 然后你会得到一个编译器错误。

List <String> myNumbers = new ArrayList<String>();

第二个例子也是类型安全的,编译器将确保只有 String 类型的对象存储在 myNumbers列表。

List <String> myNumbers = new ArrayList();

原始类型

A raw type is the name of a generic class or interface without any type arguments.

在 JDK 1.5 中引入泛型时,保留原始类型只是为了向后兼容旧版本的 java。尽管仍然允许使用原始类型,但您应该避免使用它们,原因如下:

  • 通常原始类型需要转换
  • 原始类型不是类型安全的,一些重要类型的错误只会在运行时出现。
  • 原始类型的表达能力较差,并且不会像参数化类型那样 self 记录。

最后一个示例是原始类型,这意味着我们可以将所有类型的对象添加到 myNumbers 中列出,但是,您应该尽可能避免使用它们。

List myNumbers = new ArrayList<String>();

注意 - 如果不指定类型,如上所示,myNumbers内的每一项列表被视为类型 Object .

在ArrayList的什么地方指定类型参数?

根据您展示的示例,这是首选方式:

List <String> myNumbers = new ArrayList<String>();

但是,您可以将调用泛型类的构造函数所需的类型参数替换为一组空的类型参数 ( < > ),只要编译器可以从上下文中推断类型参数。

意思不是这个:

List <String> myNumbers = new ArrayList<String>();

我们可以这样做:

List <String> myNumbers = new ArrayList<>();

关于java - 在 ArrayList 上的何处指定类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43566460/

相关文章:

java - 如何在自定义操作类中设置区域设置并在另一个java类中获取它?

.net - ConcurrentQueue(Of T) 的元素无法加宽

c# - 如何使用逆变参数将泛型接口(interface)转换为基类型?

Java 通配符读写权限

c# - 从封闭泛型中提取泛型类型

scala - 为什么我不能在扩展通用特征的类中调用参数为 `this` 的方法?

java - 引入onClick函数导致编译错误

java - Spring Boot 应用程序无法 Autowiring XML 配置

java - 当我尝试编译以下 java 代码时,出现错误 "javax.servlet package not found"

java - 访问静态字段的静态同步方法