泛型类中的意外类型编译错误,可能的参数是什么?

时间:2017-08-08 17:32:37

标签: java generics

我在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

5 个答案:

答案 0 :(得分:2)

您需要使用类Integer而不是基本类型int

jdk1.7开始,您可以使用diamond运算符<>来避免代码重复:

ArrayList<String> names = new ArrayList<>(); 
                                       ^^  

答案 1 :(得分:2)

这不是一个全新的答案,而是对已经说过的内容的总结。

使用Java Collections Framework作为类型参数(在尖括号中),您可以指定要在Collection(ListSet,...)中存储的对象类型。

通过语言设计,您不能使用intlongdouble等原始类型,只能使用引用类型。因此,如果您想在ArrayList中存储整数,则必须ArrayList<Integer>而不是ArrayList<int>

但是稍后在您的代码中,您想要将字符串添加到列表中。为此,您的列表应声明为ArrayList<String>。尝试添加非ArrayList<Integer>的任何内容时,Integer会出现编译错误。

您当然可以声明ArrayList<Object>。那个会接受所有类型的对象(StringIntegerPersonFile,...),但这违背了泛型背后的想法:告诉编译器尽可能具体地列出要在列表中允许的对象类型(并禁止其他对象),避免出现奇怪的运行时错误。

声明像

之类的东西是好的风格
List<String> names = new ArrayList<>();

Collection<String> names = new ArrayList<>();

如果您稍后决定LinkedListHashSet是更适合您的计划需要的数据结构,那么您只需更改声明的右侧。

答案 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>();