0

私の IDE は、ここのコードの最後の行に問題があると言っています ( Cannot convert from Class<Ix> to Ix)。どうすれば解決できますか?

ここでPackageは、メソッドがパッケージが提供するタイプ (インターフェース) をprovides()返すインターフェースです。Collection<Type>

mタイプを提供する Package にタイプをマップします。

Manager's get()要求されたタイプのものを返したいと思います。以下の例では、 classP1Packageを含む一連のインターフェースを提供するIxです。Managerを提供するパッケージを取得し、Ixそれを として返すように依頼できるようにしたいと考えていますIx

public class Manager {

  public HashMap<Type, Package> m = new HashMap<Type, Package>();

  public void register(Package p) {
    for(Type t : p.provides())
      m.put(t, p);
  }

  @SuppressWarnings("unchecked")
  public <T> T get(T t) {
    return (T) m.get(t);
  }

  public static void main(String[] args) {
    Manager manager = new Manager();
    P1 p1 = new P1();
    manager.register(p1);
    Ix ix = manager.get(Ix.class);
    // What do I need to change so that the method call returns p1 as an Ix?
  }
}

このコードのアイデアはばかげているように思えます。しかし、私はまだ問題とその解決方法を理解したいと思っています。前もって感謝します!

4

1 に答える 1

2

1) メソッド呼び出しが p1 を Ix として返すようにするには、何を変更する必要がありますか?

まあ、率直に言って、あなたは本当にできません。キャストを試すこともできますが、あらゆる種類のエラーがスローされると確信しています。

get()type の変数を確実に返す限り、目的の戻り値の型のインスタンスTをメソッドに渡す必要があります。この問題は、オブジェクトをに渡しているという事実に起因しているため、タイプ のオブジェクトが返されます。Classget(T t)Class

のパラメーターは、目的の戻り値の型のインスタンスget()である必要があります。 試す:
Ix ix = manager.get(new Ix());

これにより、コンパイラが提供するエラーが修正されます。しかし、あなたは間違った方法でやりたいことに近づいていると思います。

編集:あなたが言及したのはインターフェースであることに気付きました-インターフェースをインスタンス化できないため、その場合にIx実装するクラスを渡す必要がありIxます。get()


2) Manager に Ix を提供するパッケージを取得して Ix として返すように依頼できるようにしたいと考えています。

のスーパーインターフェースを求めていると思いますIxか?どんなIx実装のように?Ix少なくともエラーがなければ、変数にそれを格納することはできません。のオブジェクトとサブクラスをIx保持できますが、スーパークラス/スーパーインターフェイスは保持できません。IxIx

のスーパーインターフェースが何であるかを知りたいだけならIx、 を使用することをお勧めしinstanceofます。

于 2013-11-01T19:15:20.520 に答える