【问题标题】:About ArrayList and Generic Type [duplicate]关于 ArrayList 和泛型类型 [重复]
【发布时间】:2018-01-03 12:38:33
【问题描述】:

1.第一:有什么区别

ArrayList<Class> myList = new ArrayList<Class>();
ArrayList<Class> myList = new ArrayList<>();

2。第二:

如果我这样声明 myList:

ArrayList myList = new ArrayList<Integer>();

为什么这仍然有效:myList.add("A String!!");

使用此声明:

ArrayList<Integer> myList = new ArrayList<>();

【问题讨论】:

  • 我的意思是 ArrayList myList = new ArrayList();
  • 抱歉我的粗心@Eran

标签: java arraylist netbeans generic-type-argument


【解决方案1】:

前两者没有区别。第二个是java 7中添加的第一个的短版本(我认为)

在第二件事中,您声明了一个通用 java 列表(声明并没有说它是整数列表)。然后你给那个变量一个 ArrayList 的实例。这是你做的事情,不在声明中。这就是代码编译的原因(您可以添加一个字符串,因为数组列表的实例可以是任何东西)。但它会在运行时失败,因为在当前运行中,实例是整数列表。

当你声明它 ArrayList myList 然后它知道编译时这个列表只能有整数并且编译失败。

【讨论】:

    【解决方案2】:

    第一个问题:

    有什么区别

    ArrayList<Class> myList = new ArrayList<Class>();
    ArrayList<Class> myList = new ArrayList<>();
    

    没有区别。第二种情况,你让编译器通过type inference来决定类型。

    关于你的第二个问题:

    如果我这样声明 myList:

    ArrayList myList = new ArrayList<Integer>();
    

    为什么这仍然有效:myList.add("A String!!");

    使用此声明:

    ArrayList<Integer> myList = new ArrayList<>();
    

    You are using a raw type in the first case。这有点像使用Object 作为泛型类型,只是更糟。您放弃了所有编译时类型检查,因此您将在示例中遇到Exception

    【讨论】:

    • 在我的问题中,ArrayList 后面没有尖括号!!应该是:ArrayList test = new ArrayList();
    • 我更新了我的答案。这能回答你的问题吗?
    • ArrayList myList = new ArrayList();我声明 ArrayList 是原始类型吗??
    • 没有。 ArrayList myList = ... 是原始类型。请检查链接的问题。
    猜你喜欢
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2012-04-03
    相关资源
    最近更新 更多