当前位置: 首页 > 知识库问答 >
问题:

智能强制转换到BootsrapButton是不可能的,因为结束行程是此时已更改的可变属性

顾文昌
2023-03-14

我是 Kotlin 的新手。我有一个Android项目,我选择将其转换为kotlin。这是我的代码段。

import com.beardedhen.androidbootstrap.BootstrapButton
class EndTrip : AppCompatActivity(){
internal var endtrip: BootstrapButton ?=  null

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_end_trip)
endtrip.setOnClickListener(View.OnClickListener {
//Some code here
}
}
}

但我在旅程结束时发现了这个错误

智能强制转换为 BootsrapButton 是不可能的,因为 endtrip 是可变属性,此时已更改

这里已经回答了一个类似的问题,但是我想不出解决方案。我用的是beardedhen Android Bootstrap库。谢谢你。

共有3个答案

南宫喜
2023-03-14

我已经解决了这个问题。我删除了endtrip的全局声明,并在onCreate方法中初始化它,如下所示。

import com.beardedhen.androidbootstrap.BootstrapButton
class EndTrip : AppCompatActivity(){

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_end_trip)
 var endtrip: BootstrapButton = findViewById(R.id.endtrip) as BootstrapButton
endtrip.setOnClickListener(View.OnClickListener {
//Some code here
}
}
}

但我担心的是,如果我想在其他方法中使用变量怎么办?

长孙知
2023-03-14

val是静态的,var是可变的。科特林更喜欢一切都是静态的,在你称之为静态的地方更是如此。

只是为了澄清一点,Kotlin只喜欢你在方法中使用var,它不喜欢它的主要内容。它想要在那里增值。

var是不可变变量var是可变的。

劳英华
2023-03-14

该错误告诉您,您无法保证<code>endtrip</code>在该代码行不为空。原因是endtrip是一个var。它可以由其他线程进行变异,即使您在使用该变量之前进行了空检查。

以下是官方文件的解释:

请注意,当编译器无法保证变量在检查和使用之间不能更改时,智能转换不起作用。更具体地说,智能转换根据以下规则适用:

    < li>val局部变量-always; < li>val properties -如果该属性是私有的或内部的,或者在声明该属性的同一个模块中执行检查。智能强制转换不适用于开放属性或具有自定义getters的属性; < li>var local variables -如果变量在检查和使用之间没有被修改,并且没有在修改它的lambda中被捕获; < li>var properties - never(因为变量可以随时被其他代码修改)。

最简单的解决方案是使用安全调用操作符< code >?

endtrip?.setOnClickListener(View.OnClickListener {
    //Some code here
}

建议阅读:在Kotlin中,处理可空值、引用或转换它们的惯用方法是什么

 类似资料: