6

Javaでインターフェースを持っているとしましょう:

interface I {
    void add(I foo);
}

、およびこのインターフェースを実装する 2 つのクラス C と D もあります。

私だけができるようにインターフェイスを変更する方法はありますか:

C c = new C();
c.add(new C());

、 だがしかし

c.add(new D());

?

試験でこの質問がありましたが、私の唯一のアイデアは、メソッドの定義でinstanceof演算子を使用することでした。

class C implements I {
    public void add(I foo) {
        if (foo instanceof C) {
            System.out.println("instance of C");
        } else {
            System.out.println("another instance");
        }
    }
}

ただし、同じ効果が得られるようにインターフェイスを変更する方法がわかりません。

ありがとう

4

1 に答える 1

7

はい - ジェネリックが必要です:

interface I <T extends I<T>> {
    void add(T foo);
}

それを使用するクラスを定義するには、次のようにコーディングします。

class C implements I<C> {
    @Override
    public void add(C foo) {
        //
    }
}

実装者がこれをコーディングするのを防ぐ方法はないことに注意してください ( Dimplements も仮定するとI):

class C implements I<D> {
    @Override
    public void add(D foo) {
        //
    }
}

ただし、これは、 class のコーダーが classCの存在を知っていDて、それを使用することを選択した場合にのみ問題になります。これは、 class のコーディングに焦点を当てている場合はほとんどありませんC

この警告が与えられたとしても、この試験問題を設定した場合、上記が答えになると思います。

于 2012-09-21T19:23:56.693 に答える