Java 7 Diamond Operator上的编译错误:ArrayList<>();

时间:2012-09-27 21:04:27

标签: java eclipse diamond-operator

我有这行代码:

List<IObserver<?>> observers = new ArrayList<>();

并获得以下3个错误:

Cannot instantiate the type ArrayList<?>
Syntax error on token "<", ? expected after this token
Type mismatch: cannot convert from ArrayList<?> to List<IObserver<?>>

我正在使用Eclipse 3.7,我安装了JDK 7 update 5,并且Project设置为在Build Path中使用JRE系统库[JavaSE1.7]。

传递右边的IObserver<?>编译得很好,但我必须使用钻石操作符。

我认为这是一个配置问题,但我无法弄清楚我错过了什么。

2 个答案:

答案 0 :(得分:3)

只有当您在LHS中没有wildcard作为通用类型时,Diamond运算符才会起作用..

List<IObserver<?>> observers = new ArrayList<>();

在此代码中,编译器会看到LHS,并且对List的{​​{1}} IObserver感到满意。

但是,在运行时,您需要具有此anytype的实际类型..

如果你没有在LHS上使用anytype,它会有效。实际上你的上面的代码相当于(如果我们在Java 7之前看到它): -

Wildcard

由于RHS泛型类型是从LHS推断出来的。现在你看到了问题?您没有List<IObserver<?>> observers = new ArrayList<IObserver<?>>(); 在RHS上Concrete Type object

答案 1 :(得分:3)

代码应该工作:正确使用菱形运算符。 我建议你安装一个更新版本的Eclipse(Indigo或Juno),并将编译器合规性级别设置为1.7。

这是一个简单的工作示例(这里发明了IObserver)。打印到控制台:“我们是2”

package it.ant.test;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<IObserver<?>> observers = new ArrayList<>();
        IObserver<String> stringObserver = new Observer<>();
        IObserver<Integer> integerObserver = new Observer<>();
        stringObserver.addObserved("we are ");
        integerObserver.addObserved(2);

        observers.add(stringObserver);
        observers.add(integerObserver);

        for (IObserver<?> o : observers) {
            System.out.print(o.getObserved());
        }

    }
}

interface IObserver<T> {    
    void addObserved(T t);
    T getObserved();
}

class Observer<T> implements IObserver<T> { 
    private T observed;

    @Override
    public void addObserved(T observed) {
        this.observed = observed;

    }

    @Override
    public T getObserved() {
        return observed;
    }
}