Java 接口中的继承
我有两个接口:Java 接口中的继承,java,generics,interface,Java,Generics,Interface,我有两个接口: public interface EventListener { <T extends Data> T modify(T data); public static class Data { } } 从注释中可以看到,modify(ServerInfoData数据)不编译。为什么不呢?我该如何修复它ServerInfoData扩展了Data,所以它应该可以工作,对吗 @Override ServerInfoData modify(Serv
public interface EventListener {
<T extends Data> T modify(T data);
public static class Data {
}
}
从注释中可以看到,modify(ServerInfoData数据)
不编译。为什么不呢?我该如何修复它ServerInfoData
扩展了Data
,所以它应该可以工作,对吗
@Override ServerInfoData modify(ServerInfoData data)
不起作用,因为它实际上没有覆盖EventListener.modify
,因为它将不接受Data
的任何其他子类,而不是ServerInfoData
(及其子类)
您要么必须处理所有数据
类型,要么使接口本身具有通用性,而不仅仅是一种方法:
public interface EventListener<T extends Data> {
T modify(T data);
}
public interface ServerInfoEventListener extends EventListener<ServerInfoData> {
@Override ServerInfoData modify(ServerInfoData data);
}
公共接口事件监听器{
T修改(T数据);
}
公共接口ServerInfoEventListener扩展了EventListener{
@重写ServerInfoData修改(ServerInfoData数据);
}
不起作用,因为它实际上没有覆盖EventListener.modify
,因为它将不接受Data
的任何其他子类,而不是ServerInfoData
(及其子类)
您要么必须处理所有数据
类型,要么使接口本身具有通用性,而不仅仅是一种方法:
public interface EventListener<T extends Data> {
T modify(T data);
}
public interface ServerInfoEventListener extends EventListener<ServerInfoData> {
@Override ServerInfoData modify(ServerInfoData data);
}
公共接口事件监听器{
T修改(T数据);
}
公共接口ServerInfoEventListener扩展了EventListener{
@重写ServerInfoData修改(ServerInfoData数据);
}
重写超级方法时,不能缩小泛型类型的范围
<T extends Data> T modify(T data);
然后,您的方法不能与扩展了
数据
类的服务器信息数据
的类同级,因此它破坏了被重写的契约。在重写超级方法时,您不能缩小泛型类型
<T extends Data> T modify(T data);
然后,您的方法不能与扩展了
数据类的ServerInfoData
类同级,因此它破坏了重写的约定。我无法充分解释它不起作用的具体技术原因,但我可以解释修复方法
您的接口应该在类级别而不是方法级别使用泛型。我们还需要将数据
移出事件监听器
(原因如下):
类数据
{
//...
}
接口事件侦听器
{
T修改(T数据);
}
接口ServerInfoEventListener扩展了EventListener
{
@重写ServerInfoData修改(ServerInfoData数据);
类ServerInfoData扩展数据{
//...
}
}
类ServerInfoEventListenerImpl实现ServerInfoEventListener
{
@凌驾
公共服务器信息数据修改(最终服务器信息数据)
{
返回null;
}
}
我无法充分解释它无法工作的具体技术原因,但我可以解释修复方法
您的接口应该在类级别而不是方法级别使用泛型。我们还需要将数据
移出事件监听器
(原因如下):
类数据
{
//...
}
接口事件侦听器
{
T修改(T数据);
}
接口ServerInfoEventListener扩展了EventListener
{
@重写ServerInfoData修改(ServerInfoData数据);
类ServerInfoData扩展数据{
//...
}
}
类ServerInfoEventListenerImpl实现ServerInfoEventListener
{
@凌驾
公共服务器信息数据修改(最终服务器信息数据)
{
返回null;
}
}
在接口EventListener
方法modify
中声明的需要数据类型的参数(或任何子类)
ServerInfoData修改(ServerInfoData数据)
接受类型为ServerInfoData
的参数,但接口中的定义表示“它应该接受任何碰巧具有类型为Data
的超类的参数”,这意味着子类中方法的参数类型与接口中声明的参数类型不匹配
考虑这个例子:
public static class AnotherData extends Data {
// Whatever
}
public void main() {
EventListener el = new ServerInfoEventListener() {...};
el.modify(new AnotherData()); // We have a problem
}
问题是:没有方法实现来处理另一个数据,但是应该有,因为EventListener
这样说ServerInfoData modify(ServerInfoData data)
无法接受它,因为另一个数据
不是ServerInfoData
希望这有帮助。如接口EventListener
方法modify
中声明的,需要类型为Data
的参数(或任何子类)
ServerInfoData修改(ServerInfoData数据)
接受类型为ServerInfoData
的参数,但接口中的定义表示“它应该接受任何碰巧具有类型为Data
的超类的参数”,这意味着子类中方法的参数类型与接口中声明的参数类型不匹配
考虑这个例子:
public static class AnotherData extends Data {
// Whatever
}
public void main() {
EventListener el = new ServerInfoEventListener() {...};
el.modify(new AnotherData()); // We have a problem
}
问题是:没有方法实现来处理另一个数据,但是应该有,因为EventListener
这样说ServerInfoData modify(ServerInfoData data)
无法接受它,因为另一个数据
不是ServerInfoData
希望这有帮助。重要的是,如果您这样做,那么数据
就不能存在于EventListener
中。重要的是,如果您这样做,那么数据
就不能存在于EventListener
中。