6

假设我有一个 Java 接口:

interface I {
    void add(I foo);
}

,以及实现此接口的两个类 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) {
        //
    }
}

请注意,没有办法阻止实现者对此进行编码(假设D也实现了I):

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

但是,只有当 class 的 coderC知道 class 的存在D并选择使用它时,这才是一个问题,如果他们专注于编码 class ,这不太可能C

即使有这个警告,如果我设置这个考试问题,我希望以上是答案。

于 2012-09-21T19:23:56.693 回答