类实现接口应该只能添加同一个类的对象

Cla*_*diu 6 java generics

假设我在Java中有一个接口:

interface I {
    void add(I foo);
}
Run Code Online (Sandbox Code Playgroud)

,以及实现此接口的两个C和D类.

有什么办法可以修改界面,这样我才能这样做:

C c = new C();
c.add(new C());
Run Code Online (Sandbox Code Playgroud)

, 但不是

c.add(new D());
Run Code Online (Sandbox Code Playgroud)

我在考试中有这个问题,但我唯一的想法是在方法的定义中使用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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何修改界面使我产生相同的效果.

谢谢

Boh*_*ian 7

是的 - 你需要泛型:

interface I <T extends I<T>> {
    void add(T foo);
}
Run Code Online (Sandbox Code Playgroud)

要定义要使用它的类,请按以下方式对其进行编码:

class C implements I<C> {
    @Override
    public void add(C foo) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

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

class C implements I<D> {
    @Override
    public void add(D foo) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,如果类的编码器C知道类的存在D并选择使用它,这只会是一个问题,如果他们专注于编码类,这是不可能的C.

即使有这个警告,如果我正在设置这个考试题目,我希望以上是答案.

  • 为了避免关于非参数化类型的警告,声明应该是`interface I <T extends I <T >>`. (2认同)