質問

私は、一般的なオブザーバーインターフェースと観測クラスを作ってきたが、いくつかのジェネリック医薬品の問題が原因私のクラスをコンパイルすることはできません。私がやろうとしていることは禁じられていますなぜ私は正確にはわかりません。コードは次のとおりです。

public class Observable<U> {

    private List<Observer<Observable<U>, U>> _observers = 
            new ArrayList<Observer<Observable<U>, U>>();

    public void addObserver(Observer<? extends Observable<U>, U> obs) {
        if (obs == null) {
            throw new IllegalArgumentException();
        }
        if (_observers.contains(obs)) {
           return;
        }
        _observers.add(obs); // This line does not compile
    }

    public void notifyObservers(U data) {
        for (Observer<? extends Observable<U>, U> obs : _observers) {
            // After correction of the list declaration, this line will not compile
            obs.update(this, data); 
        }        
    }
}

interface Observer<T, U> {
    public void update(T entity, U arg);
}
役に立ちましたか?

解決

これを試してください:

 public class Observable<U> {

        private List<Observer<Observable<U>, U>> _observers =
                new ArrayList<Observer<Observable<U>, U>>();

        public void addObserver(Observer<Observable<U>, U> obs) {
            if (obs == null) {
                throw new IllegalArgumentException();
            }
            if (_observers.contains(obs)) {
               return;
            }
            _observers.add(obs);            }

        public void notifyObservers(U data) {
            for (Observer<? super Observable<U>, U> obs : _observers) {
                obs.atualizar(this, data);
            }
        }
    }

    interface Observer<T, U> {
        public void atualizar(T entity, U arg);
    }

ここでの根本的な問題を説明するために、ジェネリック医薬品は、明示的なダウンキャストを強制されています。だから、Uのいずれかの実施のための任意の「観測」を取ると、そのコレクションは、Uの特定のタイプを取るように定義されているので、コレクションにそれを置くことができない、ないもの。

ユースケースのこのタイプでは、ジェネリック医薬品は限界があり、そしてあなたは、このようなタイプの安全な方法であなたが望むものを達成することができない場合があります。

EDIT:?あなたのためになり、この作品

public class Observable<U> {

       private List<Observer<U>> _observers =
               new ArrayList<Observer<U>>();

       public void addObserver(Observer<U> obs) {
           if (obs == null) {
               throw new IllegalArgumentException();
           }
           if (_observers.contains(obs)) {
              return;
           }
           _observers.add(obs);            }

       public void notifyObservers(U data) {
           for (Observer<U> obs : _observers) {
               obs.atualizar(this, data);
           }
       }
   }

   interface Observer<U> {
       public void atualizar(Observable<U> entity, U arg);
   }

他のヒント

これにあなたの_observers定義を変更します:

private List<Observer<? extends Observable<U>, U>> _observers = 
        new ArrayList<Observer<? extends Observable<U>, U>>();

あなたは宣言でこれを指定する必要がsublclassesを許可する場合は、いないだけの場所では、あなたがそれを使用している

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top