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()
违背了面向对象的原则。子类应该可以自由地从超类继承方法。我可以问/为什么/你想这样做吗?如果目标需要属性
,则实现类不应引起关注