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
請注意,由于使用了擴展方法,因此需要導入。
添加回答
舉報