这是代码段:
abstract class SuperClass {
init {
toOverride()
}
abstract fun toOverride()
}
class ChildClass : SuperClass() {
private val innerClass = InnerClass()
override fun toOverride() {
innerClass.doSomething()
}
class InnerClass {
fun doSomething() = Unit
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val superClass = ChildClass()
superClass.toOverride()
}
}
调用superClass.toOverride()将导致空指针异常,但从ChildClass的角度来看,innerClass是一个不可变的字段。问题在于,在SuperClass的构造函数中正在调用toOverride()。
在很多情况下,我们无法控制SuperClass的编写方式。在android框架中,有很多这样的情况,例如http://androidxref.com/8.0.0_r4/xref/frameworks/base/core/java/android/view/View.java#20160将在View.java的构造函数中调用。我们如何解决这些问题?添加空检查将触发IDE警告,并且如果您使用?,则好像kotlin编译器有时会修剪空检查。运算符,因为它认为?。没必要。
答案 0 :(得分:1)
首先,我会读What's wrong with overridable method calls in constructors?
这样一来,如果您真的无法控制父类的工作,并且确实需要它来执行其工作,则可能可以执行以下操作(仅显示{{1} }:
ChildClass
我的建议是考虑您的类层次结构是否有替代实现。