2 回答
TA贡献1877条经验 获得超6个赞
如KT-4779中所述,目前 Kotlin 默认函数并未使用实际的 Java/JVM 默认方法来实现。默认实现位于静态方法中,所有使用该默认实现的类都只调用该静态方法。这样做是为了确保 Kotlin 默认函数也可以在尚不具备这些函数的 1.6 JVM 目标上运行。
所以你的代码大致可以编译成这样的 Java 等价物:
public interface MyType {
public String giveHello();
public static class MyTypeImpls {
public static String giveHello() { return "Hello!" }
}
}
public final class Polite implements MyType {
//does not override
public String giveHello() { return MyType.MyTypeImpls.giveHello() }
}
public final class Rude implements MyType {
//does override
override fun giveHello() { return "I don't like you" }
}
这就是为什么 java 反射认为两个类都重写了该函数,即因为它们实际上确实如此。
您需要在这里使用 Kotlin 反射,特别是declaredMemberFunctions和memberFunctions:
fun overridesGiveHello<T: MyType>(cls: KClass<T>) =
cls.memberFunctions.first { it.name == "giveHello" } in cls.declaredFunctions
println(overridesGiveHello(Polite::class)) //false
println(overridesGiveHello(Rude::class)) //true
TA贡献1951条经验 获得超3个赞
在这种特定情况下,我认为该isDefault()
方法应该返回true
.
我本希望Polite::class.java.getMethod("giveHello")
返回该方法,但没有getDeclaredMethod()
,但我们正处于在 Kotlin 类和接口上使用 Java 反射的世界中。Java 的期望可能无法得到满足。
不过,您可以使用 kotlin 反射,用于declaredMembers
从KClass
. kotlin.reflect.full
请注意,由于使用了扩展方法,因此需要导入。
添加回答
举报