(defined in Java)
interface Foo {
default int bar() {
throw new RuntimeException("not implemented");
}
}
(defined in Scala)
class FooImpl extends Foo {
override int bar() {
return 42;
}
}
在上面的代码片段中,我有一个用 Java 定义的接口(interface),其默认方法 bar
只会抛出异常。问题是如何检查子类 FooImpl 是否覆盖默认方法。在Java中,我们似乎可以通过反射检查Method
实例上的声明类:如果FooImpl
覆盖该方法,则声明类将是其自身,否则将是接口(interface)Foo
。
但是,上面的内容在 Scala (2.12) 中似乎并不正确:在这两种情况下,声明类都将是 FooImpl
。
最佳答案
例如,如果我有这样的东西:
interface Test {
default void go() {
}
}
static class Impl implements Test, AutoCloseable {
@Override
public void go() {
}
@Override
public void close() throws Exception {
}
}
我可以通过以下方式查明方法 m
是否是您正在寻找的方法:
private static boolean isDefaultAndOverridden(Method m, Class<?> cls) {
Class<?>[] interfaces = ClassUtils.getAllInterfacesForClass(cls);
System.out.println(Arrays.toString(interfaces));
return Arrays.stream(interfaces)
.flatMap(in -> Arrays.stream(in.getDeclaredMethods()))
.filter(Method::isDefault)
.filter(method -> method.getName().equals(m.getName()))
.filter(method -> method.getReturnType() == m.getReturnType())
.filter(method -> Arrays.equals(method.getParameterTypes(), m.getParameterTypes()))
.count() == 1;
}
我正在使用 Spring
中的 ClassUtils
来获取类直接或间接实现的所有接口(interface)。有许多库也公开了此类功能(但自己编写并不复杂)
关于java - 在Scala中,给定一个子类,如何使用反射检查它是否覆盖其父接口(interface)(在Java中定义)的默认方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66991432/