我有这个Java代码:
public interface User{
public void in(Message message);
}
public interface Message{
//....
}
public interface WebsiteMessage extends Message{
//....
}
public class WesiteUser implements User{
@Override
//I'm not allowed to do this
public void in(WebsiteMessage message){}
}
有没有办法用WebsiteMessage参数实现in
方法?
目前我正在做这样的事情:
@Override
public void in(Message message){
WebsiteMessage msg= (WebsiteMessage) message;
//..
}
答案 0 :(得分:5)
您可以使用bounded type parameter:
执行此操作public interface User<M extends Message> {
public void in(M message);
}
public class WebsiteUser implements User<WebsiteMessage> {
@Override
public void in(WebsiteMessage message) {}
}
答案 1 :(得分:3)
只是给出一个不同的观点:Liskov Substitution Principle基本上告诉你......不要这样做。
该原则的概念是,为了保持健全,您应该能够用“派生”类型替换“基础”类型的任何用法。如果您限制方法的参数,那么这不起作用。因为在基类上调用方法时,允许使用“更宽”类型;当您在派生类上尝试它时会出现错误。
限制返回类型是可以的;或扩大方法参数;但不是相反。
如果转向here,你会发现人们在谈论接口时是否也适用LSP。
长话短说:即使shmosel提出的解决方案有效;您可能想退一步考虑这是否真的是解决问题的最佳方法。你知道,声音OO设计和继承不仅仅是在这里或那里放置 extends 。