有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么接口没有一种方法要求实现类引用它们自己的类型?

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

我最初强迫自我参照的尝试是这样的:

interface Property<T extends Property<T>> {
    public T get();
}

这允许

class A implements Property<A> {
    public A get() { ... }
}

同时防止

class A implements Property<B> {
    public B get() { ... }
}

不幸的是,它允许编译以下内容:

class A implements Property<A> {
    public A get() { ... }
}
class B implements Property<A> {
    public A get() { ... }
}

有办法做到这一点吗


共 (1) 个答案

  1. # 1 楼答案

    不,无法强制子类基于Curiously Recurring Template Pattern的泛型类型参数缩小继承方法上的返回类型。您不能强制Bget()返回B。这是一个面向对象的原则,子类可以继承一个方法,而不需要对其进行任何更改

    有时我希望这个功能是一个通用的“自我关系”类型。下面是我如何理解语法的。关键字“this”将表示这种类型AABB

    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()违背了面向对象的原则。子类应该可以自由地从超类继承方法