6

我是 Java 新手,正在尝试学习程序员可以使用的各种集合。我将“java.util”导入 Eclipse 中的剪贴簿并检查以下代码。

ArrayList<String> list = new ArrayList<String>();
list.add("test1");
list.add("test2");

我收到这个输出。

The type ArrayList is not generic; it cannot be parameterized with arguments <String>
Syntax error, parameterized types are only available if source level is 5.0
The type ArrayList is not generic; it cannot be parameterized with arguments <String>
Syntax error, parameterized types are only available if source level is 5.0

这个错误是什么意思?我没有制作通用数组列表;我制作了一个字符串数组列表。此外,什么是“源级别”?

4

3 回答 3

10

您在 Eclipse 中的 Java 版本设置为 1.4,Java 中的泛型仅在 Java 5 中引入。

在 Eclipse 中将 JDK 更改为 1.5 或更高版本将解决此问题。

您可以通过以下方式检查您的 JDKProject - > Java Build Path - > Libraries

如果您在此处看到它是 Java 1.5 或更高版本,请检查编译器合规性是否设置为 5 及更高版本。

你可以检查一下Project - > Java Compiler

编辑:

将新 jdk 添加到 Eclipse

右键单击项目 -> Java 构建路径 -> 库 -> 添加库 -> JRE 系统库 -> 已安装库 -> 添加 -> 标准 VM -> 提供您的安装位置,然后按确定

请注意在已安装 JRE 的列表中,确保检查您的 Java 7。

于 2012-05-11T19:00:37.050 回答
4

我想到了什么:

  • 检查 JDK 是否完全符合泛型(以便ArrayListJSE 中的类实际上是泛型类)
  • 检查您是否没有另一个ArrayList具有范围优先级并覆盖标准库定义
于 2012-05-11T19:00:13.360 回答
1

是的,1.5 及更高版本的问题消失了。感觉这个问题没有完全解决,我加了 2 美分,以防有人遇到这个问题。主要是关于这部分问题:

我没有制作通用数组列表;我制作了一个字符串数组列表。

提到的错误消息:

> ArrayList 类型不是通用的;它不能用参数<String>参数化

> 语法错误,参数化类型仅在源级别为 5.0 时可用

它的实际意思是,从 Java 1.5 开始,我们也可以使用类型参数(其中一个习惯于使用值参数)。JDK 1.5 引入了泛型,它允许我们对类型(或参数化类型)进行抽象。

类设计器可以对定义中的类型通用。arrayList 实现如下:

public class ArrayList<E> implements List<E> .... {
    // Constructor
    public ArrayList() {...}

    // Public methods
    public boolean add(E e) {...}
    public void add(int index, E element) {...}
    public boolean addAll(int index, Collection<? extends E> c) {...}
    public abstract E get(int index) {...}
    public E remove(int index) {...}
    ...
}

其中E可以是任何类型,如 String 或 Integer 等。因此名称为泛型arrayList。

在此示例中完成的对象实例化或方法调用期间,用户可以特定于类型,如下所示:

ArrayList<String> list = new ArrayList<String>();

(如果我没记错的话,上述情况的混淆是什么:-))

泛型使用示例(如果需要):

// Declaring a DAO layer
public interface IMasterAbstractDao<E, I> {
    public E findById(I id) {...}
    public void delete(E e) {...}
    public List<E> findByCriteria(Criterion criterion) {...}
}

其中E是返回的实体类型。这可用于系统中定义的所有模型bean,使其具有通用性。

希望这可以帮助。

参考:Java 编程教程 - 泛型

于 2016-04-29T18:57:57.283 回答