接口如何包含在其签名或返回类型中引用接口的具体实现类型的方法?
假设我正在设计类似于以下接口的东西:
public interface MyInterface{
public MyInterface method1();
public void method2(MyInterface mi);
}
但是,需要注意的是,的返回类型和 的参数与具体实现匹配,而不仅仅是 。也就是说,如果我有实现,它需要具有以下特性:method1
method2
MyInterface
MyInterfaceImpl
MyInterface
public class MyInterfaceImpl implements MyInterface{
@Override
public MyInterfaceImpl method1(){...}
@Override
public void method2(MyInterfaceImpl mi){...}
}
如上所述,不会导致任何编译错误,但不能保证返回类型在所有实现中都匹配。当然,甚至不会编译,因为签名与接口不匹配。method1
method2
一个候选解决方案是在泛型中使用自引用或递归边界:
public interface MyInterface<T extends MyInterface<T>>{
public T method1();
public void method2(T mi);
}
public class MyInterfaceImpl implements MyInterface<MyInterfaceImpl>{
@Override
public MyInterfaceImpl method1();
@Override
public void method2(MyInterfaceImpl mi);
}
这将为我提供我想要的东西,但有一个例外:其他实现可能会传递错误的泛型类型(没有强制匹配具体类型)。因此,其他人可能会实现以下内容:T
public class NotMyInterfaceImpl implements MyInterface<MyInterfaceImpl>{
@Override
public MyInterfaceImpl method1();
@Override
public void method2(MyInterfaceImpl mi);
}
即使应该实现.*,那也可以编译得很好。*这让我觉得我需要别的东西。NotMyInterfaceImpl
MyInterface<NotMyInterfaceImpl>
*请注意,我不认为我试图违反LSP;我同意返回类型/参数是 的子类。NotMyInterfaceImpl
所以我不知道有一个干净的方法来做到这一点。这让我相信我可能过于关注界面中的实现细节,但对我来说似乎不是这样。有没有办法做我描述的那种事情,或者这是某种气味,我把一些东西放在一个不属于那里的界面中?