我使用的是最新版本的Android Studio。 今天编码时,我发现它给了我一个有趣的警告。所以在第45行,我有一个代码
categoryAdapter?.notifyDataSetChanged()
它表示categoryAdapter cannot be null
,但是,它可以在第二个屏幕截图中清楚地看到。
在categoryAdapter
初始化之前调用类别的setter,因此它是null(有意义的),如第3个屏幕截图所示(categoryAdapter
在第87行初始化) 。
这是编译器中的错误吗?
答案 0 :(得分:1)
您不能将;/?:@=&
定义为可空。为了使它可以为空,你必须给它一种CategoryAdapter
类型。我怀疑它没有抱怨你没有初始化它是因为你用@get:Bindable标记了它。
我建议将变量设为CategoryAdapter?
而不是lateinit var
可能更好。 Vals是不可变的,因此无论如何你都无法为它赋值。
答案 1 :(得分:1)
这是一个设计问题,但我没有看到编译器目前做的更好的替代方案。
当检查方法体时,基本上假设实例是完全构造的。否则,在初始化categoryAdapter
之前,如果您在构造函数中调用此方法,则需要使用?
标记任何对任何方法的categoryAdapter
的访问权。
也许编译器可以特别处理init
块中调用的方法,至少是非open
块。