目標
有一個函式Book,它將三個字母類之一作為引數myClass,然后從Letter*()繼承的抽象類中呼叫“genericMethod()”。
問題
如果我嘗試Book(LetterA()).read(),我會收到以下錯誤:
Type mismatch. Required: Class<SampleClassArguments.Alphabet> Found: SampleClassArguments.LetterA
Kotlin 有什么辦法可以達到這個結果嗎?
代碼
@Test
fun readBookTest() {
Book(LetterA()).read() /*<--error here*/
}
class Book(val myClass: Class<Alphabet>) {
fun read() {
val letterClass = myClass.getConstructor().newInstance()
letterClass.genericMethod(myClass.name)
}
}
class LetterA(): Alphabet()
class LetterB(): Alphabet()
class LetterC(): Alphabet()
abstract class Alphabet {
fun genericMethod(className: String) {
println("The class is: $className")
}
}
uj5u.com熱心網友回復:
您需要將 Class 型別定義為與out關鍵字協變,因此任何子類都是可接受的引數:
class Book(val myClass: Class<out Alphabet>)
而當你使用它時,你需要傳遞實際的類,而不是類的實體。您可以通過呼叫類::class.java的名稱來獲取該類:
@Test
fun readBookTest() {
Book(LetterA::class.java).read()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532321.html
標籤:科特林仿制药
上一篇:在樹中插入節點并顯示這棵樹
