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)的類(lèi)都只調(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è)類(lèi)都重寫(xiě)了該函數(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")返回該方法,但沒(méi)有getDeclaredMethod(),但我們正處于在 Kotlin 類(lèi)和接口上使用 Java 反射的世界中。Java 的期望可能無(wú)法得到滿足。
不過(guò),您可以使用 kotlin 反射,用于declaredMembers從KClass.?kotlin.reflect.full請(qǐng)注意,由于使用了擴(kuò)展方法,因此需要導(dǎo)入。
添加回答
舉報(bào)
