2012-09-27 45 views
2

我有這行代碼:Java 7 Diamond Operator上的編譯錯誤:ArrayList <>();

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的更新5和項目被設置爲使用構建路徑中的JRE系統庫[JavaSE1.7]。

傳遞在IObserver<?>在右側編譯罰款,但我必須使用鑽石操作符。

我認爲這是一個配置問題,但我無法弄清楚我錯過了什麼。

回答

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; 
    } 
} 
+0

你是對的。 Eclipse 3.7.0不支持Java 7編譯器。我轉移到Eclise 4.2 – Simulant

+0

事實上,Eclipse 3.7支持Java 7編譯器(我想知道它是否不),但是與安裝有關的一些問題。所以我留在4.2 Juno – Simulant

3

鑽石運營商只會工作,當您沒有wildcard在你LHS您的泛型類型做..

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

在這段代碼,編譯器看到的LHS,並信納,它可以是ListanytypeIObserver ..

但是,在運行時,你需要有這個anytype實際類型..

如果你不是使用Wildcard LHS,它會工作..其實你上面的代碼就相當於(如果我們把它看作是之前的Java 7): -

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

由於RHS泛型類型從LHS..Now你推斷看到問題?您沒有Concrete Type在RHS上製作的IObserver ..

+0

代碼在正確的java 7設置下編譯得很好。 – Simulant

+0

@Simulant ..可能會工作..我只是在某處閱讀這個東西..所以,我只是在理論上知道..可能是我錯了。 (但據我所知,我們需要在RHS上有'Concrete'泛型類型)。基於這些信息,我認爲這會是一個問題.. –