Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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 - Fatal编程技术网

Java 为什么不是';接口是否有办法要求实现类引用自己的类型?

Java 为什么不是';接口是否有办法要求实现类引用自己的类型?,java,generics,Java,Generics,类似于Comparable的接口使用泛型来确定类的可比类型。在某些情况下,将一个类与另一个类进行比较可能是有意义的,例如A实现了comparable。但我现在正在处理一种情况,我希望接口指定返回类型始终与实现接口的类型相同。也就是说,A.get()的类型应该始终是A 我最初试图强制进行自我参照,结果如下: interface Property<T extends Property<T>> { public T get(); } 接口属性{ 公众不能得到(); }

类似于
Comparable
的接口使用泛型来确定类的可比类型。在某些情况下,将一个类与另一个类进行比较可能是有意义的,例如
A实现了comparable
。但我现在正在处理一种情况,我希望接口指定返回类型始终与实现接口的类型相同。也就是说,
A.get()
的类型应该始终是
A

我最初试图强制进行自我参照,结果如下:

interface Property<T extends Property<T>> {
    public T get();
}
接口属性{
公众不能得到();
}
这允许

class A implements Property<A> {
    public A get() { ... }
}
A类实现属性{
public A get(){…}
}
同时防止类似的事情发生

class A implements Property<B> {
    public B get() { ... }
}
A类实现属性{
公共B get(){…}
}
不幸的是,它允许编译以下内容:

class A implements Property<A> {
    public A get() { ... }
}
class B implements Property<A> {
    public A get() { ... }
}
A类实现属性{
public A get(){…}
}
类实现属性{
public A get(){…}
}

有办法做到这一点吗?

没有,没有办法强制子类基于的泛型类型参数缩小继承方法上的返回类型。您不能强制
B
具有
get()
返回
B
。这是一个面向对象的原则,即子类可以继承一个方法,而不改变它的任何内容

有时我希望有这样一个特性——一个通用的“与自我的关系”类型。下面是我如何理解语法的。关键字“this”将在
A
中表示该类型-
A
B
中表示该类型

public class A {
    public this get() {
       return this;  // Or another instance of this type
    }
}
public class B extends A {
    // "this" on get in A forces B to override "get"
    // to narrow the return type
    @Override
    public this get() {
       return this;
    }
}

但是强制
B
重写
getA()
违背了面向对象的原则。子类应该可以自由地从超类继承方法。

我可以问/为什么/你想这样做吗?如果目标需要
属性
,则实现类不应引起关注