2 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
如KT-4779中所述,目前 Kotlin 默認(rèn)函數(shù)并未使用實(shí)際的 Java/JVM 默認(rèn)方法來(lái)實(shí)現(xiàn)。默認(rèn)實(shí)現(xiàn)位于靜態(tài)方法中,所有使用該默認(rèn)實(shí)現(xiàn)的類都只調(diào)用該靜態(tài)方法。這樣做是為了確保 Kotlin 默認(rèn)函數(shù)也可以在尚不具備這些函數(shù)的 1.6 JVM 目標(biāo)上運(yùn)行。
所以你的代碼大致可以編譯成這樣的 Java 等價(jià)物:
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 反射認(rèn)為兩個(gè)類都重寫了該函數(shù),即因?yàn)樗鼈儗?shí)際上確實(shí)如此。
您需要在這里使用 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貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
在這種特定情況下,我認(rèn)為該isDefault()
方法應(yīng)該返回true
.
我本希望Polite::class.java.getMethod("giveHello")
返回該方法,但沒有getDeclaredMethod()
,但我們正處于在 Kotlin 類和接口上使用 Java 反射的世界中。Java 的期望可能無(wú)法得到滿足。
不過(guò),您可以使用 kotlin 反射,用于declaredMembers
從KClass
.?kotlin.reflect.full
請(qǐng)注意,由于使用了擴(kuò)展方法,因此需要導(dǎo)入。
添加回答
舉報(bào)