Kotlin中抽象超类中的内部类?

时间:2017-11-20 03:44:04

标签: kotlin abstract-class instantiation inner-classes

如果一组内部类是其外部抽象包含类的唯一实现(子类),那么如何实例化它们?

abstract class A {
    inner class A1 : A()
    inner class A2 : A()
}

换句话说,构建A1A2的实例的语法是什么?

编辑: ...在A类机构之外。

1 个答案:

答案 0 :(得分:3)

你在找这个吗?

abstract class A {
    fun doSome() { // OK
        val a1 = A1()
        val a2 = A2()
    }
    inner class A1 : A()
    inner class A2 : A()
}

我想你可能想在A之外构造A1 / A2的实例,比如:

abstract class A {
    inner class A1 : A()
    inner class A2 : A()
}
fun doSome() { // Error
    val a1 = A1()
    val a2 = A2()
}

在Kotlin和Java中都不允许这样做,因为内部类持有外部类的ponters。如果您想在A1之外构建A2 / A,只需删除inner修饰符。

abstract class A {
    class A1 : A()
    class A2 : A()
}

fun doSome() { // OK again
    val a1 = A.A1()
    val a2 = A.A2()
}

另外,因为你说过它

  

一组内部类是包含类

的外部抽象的唯一实现(子类)

您可以将abstract修饰符替换为sealed。这将有助于Kotlin在when表达式中进行穷举检查。