2

これが私の全体的なワークフローです。最初にインターフェースを作成します。

public interface foo {
   void bar(Baz b);
}

次に、たとえば、すべてが上記のインターフェイスを実装するさまざまなオブジェクトを含むベクトルを作成します。

myVector.add(new Ex);  //both Ex and Why implement foo.
myVector.add(new Why); 

そして最後に、インターフェースを使用します。

for(int i=0; i<myVector.size(); i++) {
    myVector.get(i).bar(b);
}

ただし、明らかな理由により、これによりコンパイル時エラーが発生します。

メソッドbar()は、タイプObjectに対して未定義です。

ExとWhyは関連していないため、キャストは機能しません。Exへのキャストをキャッチしてみてください。それからなぜ恐ろしい回避策です。ExとWhyの両方を拡張するBar_doersも、インターフェイスがなくなるため、簡潔に聞こえません。

オブジェクトが特定のクラスのものであるかどうかではなく、オブジェクトが特定のインターフェイスを実装するかどうかを気にする操作を実行するにはどうすればよいですか?

4

3 に答える 3

11

ジェネリックについて読む必要があります。

標準のJavaコンテナを使用していると仮定すると、この場合の解決策は次のように定義するmyVectorことです。

List<foo> myVector = new ArrayList<foo>();
于 2013-01-13T21:46:41.130 に答える
2

それらをインターフェースにキャストすると、機能します。

for(int i=0; i<myVector.size(); i++) {
    ((foo)myVector.get(i)).foo(b);
}
于 2013-01-13T21:46:34.850 に答える
1
public interface A {
    public void myMethod();
}




public class B implements A {

    @Override
    public void myMethod() {
        System.out.println("B");
    }

}


import java.util.ArrayList;
import java.util.List;



public class C implements A {

    @Override
    public void myMethod() {
        System.out.println("C");
    }

    public static void main(String[] args){
        List<A> list = new ArrayList<>();
        list.add(new B());
        list.add(new C());

        for(A obj : list){
            obj.myMethod();
        }
    }

}

上記は印刷されます:

B
C
于 2013-01-13T21:55:19.033 に答える