java - 方法的参数 - 同时需要类和接口(interface)

标签 java

我有一个类上下文。它需要传递给另一个类的构造函数并在其中使用 - 比如说,Manager。但是上下文变量也必须是 MyInterface 的实现,它有义务实现 requiredMethod()。所以我想成为这样的人:

class Manager {
    Manager(Context context) {
        context.doSomeStandardContextStuff();
        if (context instanceof MyInterface) {
            context.requiredMethod()
        }
    }
}

但是,编译器和IDE告诉我requiredMethod()无法解决。

那么,为了解决这个问题,我是否有义务创建一个“人造的”另一个类,它从 Context 类扩展并实现 MyInterface - 只是为了在上面的构造函数中将它用作单个对象?或者有更好的解决方案吗?

最佳答案

您可以使构造函数成为通用的,并绑定(bind)一个 double 类型:

<T extends Context & MyInterface> Manager(T context) {
    context.doSomeStandardContextStuff();
    context.requiredMethod();
}

这完全避免了强制转换。


但是,您也可以指定实现类型。即:

class Implementation extends Context implements MyInterace {...}
Manager(Implementation i) {...}

或者,如果您有多个实现,请创建一个公共(public)父类(super class)型:

abstract class Union extends Context implements MyInterface {}
class Implementation extends Union {...}
Manager(Union u) {...}

Union 将是一个虚拟类,但仍然比通用版本更有效。

由于通用版本被删除以将 Context 作为参数,并且每次您想调用方法时都必须(在幕后)转换为 MyInterface来自 MyInterface

关于java - 方法的参数 - 同时需要类和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923675/

相关文章:

java - database.models.Employee 不是在此服务器上注册的实体 Bean?

java - 如何将附加数据传递给 Mapper?

java - 如何在使用模糊域时从 Java 应用程序发送电子邮件?

Java JDBC : Reply. 填充()

java - 如何将鼠标移动到基于 JFrame 的坐标?

java - 基于唯一属性的存在使用 Jackson 反序列化多态类型

java - 如何在没有 IntelliJ 的情况下在本地主机上运行 Spring 应用程序?

java - 我如何修复 org.hibernate.PersistentObjectException 错误?

java - 如何在 SWT java 中的选项卡式项目中创建新选项卡

java - Android-以编程方式发送彩信而不是默认应用程序