我在java中开始收集框架,我有一个简单的代码,但它让我对通用类的可能参数可能有什么好奇。
import java.util.ArrayList;
import java.util.LinkedList;
class ListExa{
public static void main(String[] args){
ArrayList<int> names = new ArrayList<int>();
names.add(1);
names.add(2);
names.add(3);
names.add(4);
names.add(5);
System.out.println(names);
}
}
ListExa.java:6: error: unexpected type
ArrayList<int> names = new ArrayList<int>();
required: reference
found: int
答案 0 :(得分:2)
您需要使用类Integer
而不是基本类型int
:
从jdk1.7
开始,您可以使用diamond
运算符<>
来避免代码重复:
ArrayList<String> names = new ArrayList<>();
^^
答案 1 :(得分:2)
这不是一个全新的答案,而是对已经说过的内容的总结。
使用Java Collections Framework作为类型参数(在尖括号中),您可以指定要在Collection(List
,Set
,...)中存储的对象类型。
通过语言设计,您不能使用int
,long
,double
等原始类型,只能使用引用类型。因此,如果您想在ArrayList
中存储整数,则必须ArrayList<Integer>
而不是ArrayList<int>
。
但是稍后在您的代码中,您想要将字符串添加到列表中。为此,您的列表应声明为ArrayList<String>
。尝试添加非ArrayList<Integer>
的任何内容时,Integer
会出现编译错误。
您当然可以声明ArrayList<Object>
。那个会接受所有类型的对象(String
,Integer
,Person
,File
,...),但这违背了泛型背后的想法:告诉编译器尽可能具体地列出要在列表中允许的对象类型(并禁止其他对象),避免出现奇怪的运行时错误。
声明像
之类的东西是好的风格List<String> names = new ArrayList<>();
或
Collection<String> names = new ArrayList<>();
如果您稍后决定LinkedList
或HashSet
是更适合您的计划需要的数据结构,那么您只需更改声明的右侧。
答案 2 :(得分:1)
您应该为整数使用包装类,而不是基本类型:
ArrayList<Integer> names = new ArrayList<Integer>();
有关详细信息,请点击此处: Why don't Java Generics support primitive types?
答案 3 :(得分:0)
ArrayList<int> names = new ArrayList<int>();
这不起作用,因为它将参数作为对象,但是当我们传递int时,它是原始数据类型。
Java具有内置到对象中的Wrapper类:
int -> Integer and so on.
正确的方法是:
ArrayList<Integer> names = new ArrayList<>();
答案 4 :(得分:-1)
collection仅支持object,使用Integer而不是int
作为最佳做法,我们不应该像这样写ArrayList<Integer> names = new ArrayList<Integer>();
意味着总是给出super的引用所以它应该是这样的
List<Integer> names = new ArrayList<Integer>();