Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口中的继承_Java_Generics_Interface - Fatal编程技术网

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
中。