java - 使子类在不覆盖的情况下返回自身

标签 java generics inheritance

假设我有一个接口(interface) Interface,它有一个应该返回自身的方法 aMethod(),但也有一个默认实现。然后我还有一个类 Foo 实现了 Interface 并添加了额外的方法 aFooMethod()

interface Interface {

    public default Interface aMethod() {
        // Some code
        return this;
    }
}

class Foo implements Interface {

    public void aFooMethod() {
        // Some code
    }
}

现在我不能调用 new Foo().aMethod().aFooMethod(); 因为 aMethod() 返回一个 Interface

现在我显然可以继续并覆盖 Foo 中的方法:

class Foo implements Interface {

    @Override
    public Foo aMethod() {
        Interface.super.aMethod();
        return this;
    }

    public void aFooMethod() {
        // Some code
    }
}

我的问题是,是否有一种强制执行此操作的好方法,即子类必须返回自身而不必重写该方法?

我最好的方法是这样说:

interface Interface<I extends Interface<I>> {

    @SupressWarnings("unchecked")
    public default I aMethod() {
        // Some code
        return (I)this;
    }
}

但这不是我认为的,因为它必须使用SupressWarnings("unchecked")。有没有更好的办法?

最佳答案

我最近问了一个关于同样的事情的问题,但是是在 C# 中。尽管问题和答案仍然相同:这样的事情是不可能的。

你提到的模式

interface Interface<I extends Interface<I>> {}

乍一看似乎是个好方法,但一旦有多个类实现了 Interface 就会分崩离析。 .问题不是抑制警告的必要性,实际上是更大的问题。如果我像这样创建两个类:

class A implements Interface<A> {}
class B implements Interface<A> {}

它仍然有效。约束 I extends Interface<I>只强制类型参数 I成为Interface<I> , 和 A是否实现 Interface<A> ,因此即使在 Interface<A> 时它也满足约束条件由 B 实现.

我一直在努力寻找解决这个问题的方法,但遗憾的是,Java 和 C# 都不允许沿着这些思路进行任何操作。

关于java - 使子类在不覆盖的情况下返回自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64823508/

相关文章:

java - Oracle 对 Java 泛型的跟踪之一的潜在问题

java - 为什么 javac 提示与类的类型参数无关的泛型?

css - <ul> 继承它不应该的属性

java - 初学者无法创建第一个 Android 应用程序项目

java - 具有前 N 个解决方案的遗传算法

arrays - 如何在不进行类型转换的情况下将展平实现为数组的扩展?

java - 多个泛型 : Best Common superclass

node.js - Nodejs + ExpressJS 中的类成员继承

c++ - 继承:类字符串

java - 在 Jboss 4.2.3 中部署了 EJB3。我们如何访问它?