假设我有这两个接口......
public interface ObjectInterface { /* empty interface */ }
public interface ObjectHandler
{
void handle(ObjectInterface object);
}
...还有一个实现ObjectInterface的具体类:
public class ConcreteObject implements ObjectInterface { /* ... */ }
为什么Java中不允许这样做?
public class ConcreteHandler implements ObjectHandler
{
@Override
public void handle(ConcreteObject object) // <-- ObjectInterface implementation
{
// ...
}
}
ConcreteObject
实现了ObjectInterface
界面
但是,有没有办法用Java设计我的类来保持这种抽象模式?
答案 0 :(得分:2)
接口方法是合同,
void handle(ObjectInterface object);
因此,接口的实现应遵守合同。所以它不会让你限制它接受的对象类型。
handle(ConcreteObject object){...}
以上限制了方法的输入,因为它只是ObjectInterface
的一个实现。想想如果有另一个名为ConcreteObject2
的实现实现了ObjectInterface
,会发生什么。根据您的代码handle
方法,我们不接受ConcreteObject2
类型对象。
如果您想保留模式,可以使用java generics
答案 1 :(得分:2)
因为你违反了界面的合同,从而打破了Liskov替代原则。
接口说:handle()
可以将ObjectInterface的任何实例作为参数。这是合同:handle()
的任何实现都必须接受ObjectInterface的任何实例。
但是该类说:handle()
只接受ConcreteHandler的实例。
答案 2 :(得分:2)
您可以使用已接受的ObjectHandler
类:
ObjectInterface
public interface ObjectHandler<T extends ObjectInterface>
{
void handle(T object);
}
并按如下方式使用:
public class ConcreteHandler implements ObjectHandler<ConcreteObject>
{
@Override
public void handle(ConcreteObject object) // <-- now this works
{
// ...
}
}