2

我有这行代码:

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,并且项目设置为使用构建路径中的 JRE 系统库[JavaSE1.7]。

传入IObserver<?>右侧的编译很好,但我必须使用菱形运算符。

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

4

2 回答 2

5

代码应该可以工作:正确使用了菱形运算符。我建议您安装更新版本的 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;
    }
}
于 2012-09-27T21:40:01.597 回答
3

只有当您wildcard的 LHS 中没有泛型类型时,菱形运算符才会起作用。

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

在这段代码中,Compiler 看到 LHS ,并且满意它可以ListIObserver..anytype

但是,在运行时,您需要拥有 this 的实际类型anytype

如果您没有Wildcard在 LHS 上使用它,它会起作用。实际上您上面的代码等效于(如果我们将其视为 Java 7 之前的代码):-

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

由于 RHS 泛型类型是从 LHS 推断出来的。现在你看到问题了吗?你在 RHS 上没有什么Concrete Type可做objectIObserver..

于 2012-09-27T21:07:51.823 回答