具有扩展接口参数的实现方法

时间:2016-08-17 07:58:59

标签: java

我有这个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;
     //..
}

2 个答案:

答案 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