当前位置: 首页 > 知识库问答 >
问题:

实现它的Java接口函数返回类

姬俊驰
2023-03-14

我有一个接口,它的函数当前返回它自己。但是,我希望任何实现类都返回该类,而不是基接口。例如,在这个简化的示例中,它工作得很好:

public interface MyInterface<T, U> {
    public void foo(T t, U u);

    public MyInterface baz();
}

public class MyClass<T, U> implements MyInterface<T, U> {
    @Override
    public void foo(T t, U u) {}

    public MyClass bar() {
        return this;
    }

    @Override
    public MyInterface baz() {
        return this;
    }
}
@Override
public MyClass baz() {
    return this;
}

这显然是失败的,因为重写函数不再与接口中的声明匹配。

我需要baz()返回Class而不是Interface,因为调用者可以以任意顺序调用bar和baz任意次数,但是目前所有bar()调用必须在所有baz()调用之前,除非我们重复地向下调用。

更复杂的是foo()函数,它使用两个泛型类型。我研究了如何使用奇怪地重复出现的泛型模式,但无法找到合理的解决方案,因为接口已经处理泛型了,即使没有它。

共有1个答案

缪晋
2023-03-14

如果希望接口返回已定义的类型,则需要另一个类型参数(例如,名为W),并且需要确保该类型是接口,因此:

public interface MyInterface<T, U, W extends MyInterface<T, U, W>> {
    public void foo(T t, U u);

    public W baz();
}

public class MyClass<T, U> implements MyInterface<T, U, MyClass<T, U>> {
    @Override
    public void foo(T t, U u) {}

    public MyClass<T, U> bar() {
        return this;
    }

    @Override
    public MyClass<T, U> baz() {
        return this;
    }
}

注意:添加了前缀my,以避免与名为class的内置类混淆。

 类似资料:
  • 但是,我的问题在于如何理解当我尝试使用而不是执行相同操作时会发生什么 这里的例子是,有一个接口定义被定义为接受一个接口参数,实际上,这个接口参数是由实现接口的枚举实现的: 我有两个接口: 我看到了一些关于,但这扩展了我的理解。请救命! 顺便说一句,我认为返回类之前的泛型声明被用来指定“T”以用于类型侵蚀的目的,这是正确的吗?

  • 好吧,乖点。 这里有一个枚举,它实现了一个接口,该接口返回一个“原始类型”,它给我一个关于接口中的方法的警告。 如果我将接口的方法更改为: 它会在的方法签名上变为未经检查的警告。如果我改变的签名: 然后返回有一个不兼容的类型错误,因为

  • 问题内容: 我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么? 播放:https://play.golang.org/p/CqbuEZGy12 我的解决方案基于Volker的答案: 播放:https://play.golang.org/p/waOGBZZwN7 问题答案: 你绊倒了围棋新人一个非常普遍的误解:空接口并 不能 意味着“任何类型”。确实不

  • 本文向大家介绍Java接口统一样式返回模板的实现,包括了Java接口统一样式返回模板的实现的使用技巧和注意事项,需要的朋友参考一下 前言 一开始,我们在写项目的时候,前端要什么数据,我们就返回什么数据,每个接口也都写得不一样很乱;随着前后端的分离;对于代码规范的要求也越来越严谨;接口都是统一样式的返回模板; 下面,接受一种我之前用过的返回模板; 一、首先来看下我们的Controller接口 我们可

  • 问题内容: 如何在实现类中强制执行方法getFoo(),返回相同实现类类型的列表。 现在,实现Bar的类将返回实现Bar的任何类的对象。我想使其更加严格,以便实现Bar的类在getFoo()中仅返回其类型的对象列表。 问题答案: 不幸的是,这不能由Java的类型系统强制执行。 但是,您可以通过使用以下方法来达到非常接近的效果: 然后您的实现类可以像这样实现它: 但是没有什么可以阻止另一个类这样做:

  • 我有一个接口 创建 有两种方法,一种是异步的,一种是同步的。我想为这两个方法中的每一个提供一个接口实现。 对于异步方法,其实现可能如下所示: 但是我应该如何实现使用同步方法创建 的类 呢? 我可以实现方法以同步运行: 然后,编译器将警告不要在方法签名中使用 : 此异步方法缺少'await'运算符,将同步运行。考虑使用'await'运算符等待非阻塞API调用,或'await task.run(...