假设我在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)
但是,我不知道如何修改界面使我产生相同的效果.
谢谢
是的 - 你需要泛型:
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.
即使有这个警告,如果我正在设置这个考试题目,我希望以上是答案.