【问题标题】:Compile Error on Java 7 Diamond Operator: ArrayList<>();Java 7 Diamond 运算符上的编译错误:ArrayList<>();
【发布时间】:2012-09-27 21:04:27
【问题描述】:

我有这行代码:

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&lt;?&gt; 编译正常,但我必须使用菱形运算符。

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

【问题讨论】:

    标签: java eclipse diamond-operator


    【解决方案1】:

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

    这是一个简单的工作示例(这里发明了 IObserver)。打印到控制台:“we are 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;
        }
    }
    

    【讨论】:

    • 你是对的。 Eclipse 3.7.0 不支持 Java 7 编译器。我搬到了 Eclise 4.2
    • 事实上 Eclipse 3.7 支持 Java 7 编译器(我想知道它是否不支持),但是设置有一些问题。所以我留在 4.2 Juno
    【解决方案2】:

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

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

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

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

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

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

    由于 RHS 泛型类型是从 LHS 推断出来的..现在您看到问题了吗?你没有 Concrete Type 来在 RHS 上制作 objectIObserver..

    【讨论】:

    • @Simulant.. 可能会奏效.. 我只是在某处读过这个东西.. 所以,我只是理论上知道.. 可能是我错了。 (但是,据我所知,我们需要在 RHS 上有 Concrete 泛型类型)..根据这些信息,我认为这将是一个问题..
    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2012-08-13
    • 2014-05-21
    • 2014-06-16
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多