如何在Kotlin中从Class参数调用抽象方法?

new9mtju  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(159)

目标

有一个函数Book,它将三个Letter类中的一个作为参数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")
        }
    }
nwsw7zdq

nwsw7zdq1#

您需要使用out关键字将Class类型定义为协变,这样任何子类都是可接受的参数:

class Book(val myClass: Class<out Alphabet>)

当你使用它的时候,你需要传递的是实际的类,而不是类的一个示例。你可以通过在类的名字上调用::class.java来获得类:

@Test
fun readBookTest() {
    Book(LetterA::class.java).read()
}

相关问题