检查类是否“遵守”接口而无需实现它

3
我想检查一个类是否实现了特定接口的所有方法,而不是直接实现它。
例如,考虑以下接口。
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);true,而 MyInterface.class.isAssignableFrom(B.class);false。我正在寻找一种方法,可以同时返回这两个类的真值。

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


4
反思是一种前行的方式。 - jonasnas
5
我很好奇你在这里想要实现什么目标。Java并不是一种真正的鸭子类型语言,所以它有什么价值呢?我的意思是,仅仅实现某个接口规定的所有方法,并不能意味着该类可以与接口的用户以任何富有意义的方式进行交互。 - sisyphus
@sisyphus 我生成了一个 Web 服务客户端,得到了许多类(Web 方法的返回类型)具有相同的方法。由于 Web 服务客户端将被多次生成,我更喜欢避免编辑生成的类。 - 888
即使有100个类,使用implements MyInterface更安全。这样你的代码会更加健壮,适用于新的类...或者使用反射。这并不太难。 - guillaume girod-vitouchkina
1
如果您通过反射来完成这个任务,那么需要进行大量的工作——方法签名需要匹配,但不需要完全匹配。因此,您必须能够处理协变返回类型、通过不同数量的参数进行方法覆盖、参数类型的扩展/缩小以及异常处理的扩展/缩小。 - sisyphus
1个回答

2

没有使用反射是无法做到这一点的。

而且...

接口就是合同

虽然您可能能够确定B确实有与MyInterface中名称相同的方法,但您无法确定它们是否实际上执行相同的操作。

通过实现一个接口(如B应该),您不仅实现了该接口的方法,而且还承诺以预期的方式提供结果。在这种情况下,具有相同名称和参数的方法将无法胜任。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接