【问题标题】:Check if class "respects" interface without implementing it检查类是否“尊重”接口而不实现它
【发布时间】:2015-12-18 11:39:16
【问题描述】:

我想检查一个类是否实现了特定接口的所有方法而不直接实现它。

即考虑接口

public interface MyInterface {
    public String myMethod();
}

以及以下类:

A实现了接口,方法myMethod也实现了

public class A implements MyInterface {
    public String myMethod() {
        return "something";
    }
}

B没有实现接口,但是有方法myMethod

public class B {
    public String myMethod() {
        return "something else";
    }
}

所以MyInterface.class.isAssignableFrom(A.class);trueMyInterface.class.isAssignableFrom(B.class);false。我正在寻找一种对两个类都返回 true 的方法。

使用反射,对于每个类,我可以循环访问接口的方法并检查它是否在类中实现。有没有更聪明的方法来做到这一点?

【问题讨论】:

  • 反思是一种方法
  • 我很好奇你想在这里实现什么。 Java 并不是真正的鸭式语言,那么它的价值是什么?我的意思是,实现某个接口指定的所有方法并不意味着该类可以以任何有意义的方式与该接口的用户交互。
  • @sisyphus 我生成了一个 Web 服务客户端,我得到了许多具有相同方法的类(Web 方法的返回类型)。由于 Web 服务客户端会多次生成,所以我倾向于避免编辑生成的类。
  • 放置实现 MyInterface 更安全,即使是 100 个类。在那里,您的代码将更加健壮,对于新的......或者使用反射。不太难。
  • 如果您通过反射执行此操作,则涉及大量工作 - 签名需要匹配,但不需要完全匹配。因此,您必须能够处理协变返回类型、通过不同数量的参数覆盖方法、扩大/缩小参数类型以及扩大/缩小异常处理。

标签: java interface


【解决方案1】:

不,如果没有反思,你就无法做到这一点。

还有……

接口就是合约

虽然您可能会发现 B 确实有与 MyInterface 中的方法同名的方法,但您无法判断它们是否真的做同样的事情

通过实现一个接口(正如 B 应该有的那样),您不仅实现了该接口的方法,而且您承诺以预期的方式提供结果。在这种情况下,使用具有相同参数的同名方法是行不通的。

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多