使用@JvmInline注釋的 Kotlin 值類時遇到問題
這是一個例子:
@JvmInline
value class TestClass(val id: String)
interface TestInterface {
fun doSomething(aVal: TestClass)
fun callSomething(aVal: String)
}
fun main() {
val clazz = TestInterface::class.java
clazz.methods.forEach { println(it) }
}
結果輸出:
public abstract void TestInterface.callSomething(java.lang.String)
public abstract void TestInterface.doSomething-Qkb7kKY(java.lang.String)
預期輸出:
public abstract void TestInterface.callSomething(java.lang.String)
public abstract void TestInterface.doSomething(java.lang.String)
任何想法如何在不切換到資料類的情況下解決這個問題?
uj5u.com熱心網友回復:
值類在運行時不存在。
正如您從輸出中看到的那樣,您的方法的簽名是TestInterface.doSomething-Qkb7kKY(java.lang.String). 由于值類本質上是其值的運行時包裝器,因此該方法的真正簽名具有一個 String 引數。String在編譯時,使用單個引數向此方法添加另一個多載是完全可以的,在運行時,這會導致沖突。讓我們擴展您的示例;
@JvmInline
value class TestClass(val id: String)
interface TestInterface {
fun doSomething(aVal: TestClass)
fun doSomething(aVal: String)
fun callSomething(aVal: String)
}
fun main() {
val clazz = TestInterface::class.java
clazz.methods.forEach { println(it) }
}
上面的輸出將如下所示,因此如果它具有相同的名稱,則會發生沖突;
public abstract void TestInterface.callSomething(java.lang.String)
public abstract void TestInterface.doSomething(java.lang.String)
public abstract void TestInterface.doSomething-Qkb7kKY(java.lang.String)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481592.html
標籤:科特林
