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 はここで発明されました)。コンソールに出力: "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;
    }
}
于 2012-09-27T21:40:01.597 に答える
3

wildcardDiamond 演算子は、LHS にジェネリック型がない場合にのみ機能します。

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

このコードでは、Compiler は LHS を認識し、LHSListが..IObserveranytype

ただし、実行時には、これの実際の型が必要anytypeです..

LHS でを使用していなければWildcard、機能していたはずです。実際、上記のコードは次と同等です (Java 7 より前の場合): -

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

RHS ジェネリック型は LHS から推測されるため、問題がわかりましたか?? あなたはRHSでConcrete Type作る必要はありません..objectIObserver

于 2012-09-27T21:07:51.823 に答える