This question already has answers here:
I can't reach any class member from a nested class in Kotlin
(2个答案)
1年前关闭。
我正在尝试某些事情,偶然发现了一个问题,该问题无法从类
这是在 Kotlin :
(2个答案)
1年前关闭。
我正在尝试某些事情,偶然发现了一个问题,该问题无法从类
str1
访问全局变量MyAsyncTask
。我猜想,它肯定有一些声明错误,但对于所违反的内容我不太确定。class MainActivity : AppCompatActivity() {
var str1 = "0"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
for (i in 0..5){
val myAsyncTask = MyAsyncTask(this@MainActivity)
myAsyncTask.execute("-")
str1 = str1 + "1"
}
}
class MyAsyncTask(private var c : Context):AsyncTask<String,Void,String>(){
override fun doInBackground(vararg str: String?): String {
str1 = str1 + str[0] + "2" // str1 is bolded in red, somehow, i cant access it
return str1
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
Toast.makeText(c, result, Toast.LENGTH_SHORT).show()
}
}
}
最佳答案
通常,如果您在Kotlin中使用类似的语法在Java中可以工作,请反编译Kotlin代码。在IntelliJ / Android Studio中,工具-> Kotlin->显示Kotlin字节码。稍加修改,即可编译代码,您将看到该类的声明为public static final class MyAsyncTask extends AsyncTask
。如果您熟悉内部类的工作方式,那么您会知道静态内部类就像在一个单独的文件中声明它们一样;它们没有与其外部类相关的上下文,因此无法访问非静态变量。这有点像从同伴对象或静态方法访问非静态变量。静态的任何东西都没有附加到对象的特定实例,因此不能访问非静态的变量。
那就是问题所在。如果您从此处搜索想要的内容,通常可以找到文档的链接,至少是与基本语言相关的内容。
如果您想要常规的内部类,则必须使用Kotlin的特殊关键字。关键字也非常简单明了: inner
。将您的类声明更改为inner class MyAsyncTask
,进行反编译,然后查看如何将其更改为public final class MyAsyncTask extends AsyncTask
。
TL; DR:
在Java中:
public class MyClass {
public class Something {}
}
这是在 Kotlin :
class MyClass {
inner class Something
}