我使用Kotlin编写了此代码:
class A{
var myVariable:String?=null
constructor(myVariable:String){
this.myVariable = myVariable
}
init {
println("Success !")
}
inner class B{
init {
println(myVariable)
}
}
}
fun main(args:Array<String>){
var b = A("test").B // this does not work
}
不幸的是,我无法使用它:
Error:(20, 23) Kotlin: Nested class 'B' accessed via instance reference
Error:(20, 23) Kotlin: Classifier 'B' does not have a companion object, and thus must be initialized here
我该如何解决我的问题?
答案 0 :(得分:5)
当您这样做:
A("test").B
您说的是“从A的实例中获取内容”-在这种情况下,它是一个类。但是,这不是您要查找的语法。您几乎可以获得任何东西,但是获得参考是一个单独的问题。如果要获取函数,语法与获取字段或调用函数不同。尽管这不是很重要,但还是有一点值得记住。
由于B是一个内部类,因此到目前为止,您是完全正确的,因此您首先需要A的实例。但是,您还需要一个B的实例。初始化B时,它仍然“连接”到父类,这就是为什么您可以毫无问题地访问外部变量的原因。但是,它仍然是可初始化的类-您需要对其进行初始化。
因此,您还需要初始化B。 Kotlin的语法非常不错(就像Java is slightly horrible中的语法一样)-您最后需要添加的内容就是()
。
因此,您将得到以下结果:
val b = A("test").B()
// ...
这是因为它是一个内部类。如果您有一个静态内部类(在Kotlin中,这是一个没有inner
关键字的类中的类),则初始化将是A.B()
-在这种情况下不会初始化。>
您还可以拆分初始化:
val a = A("test")
val b = a.B();
一旦有了变量,它就与其他变量完全一样-唯一的区别是初始化。
答案 1 :(得分:0)
您应该在访问类B
的成员之前创建一个实例(调用构造函数):
fun main(args:Array<String>) {
val b = A("test").B()
b.someFunction()
}
class A {
var myVariable:String? = null
constructor(myVariable: String) {
this.myVariable = myVariable
}
init {
println("Success !")
}
inner class B {
init {
println(myVariable)
}
fun someFunction() {
myVariable = "set new value to the variable"
}
}
}
答案 2 :(得分:0)
尝试一下:
class A{
var myVariable:String?=null
constructor(myVariable:String){
this.myVariable = myVariable
}
init {
println("Success !")
}
inner class B{
init {
println(myVariable)
}
}
}
fun main(args:Array<String>){
var b = A("test").B() // You have to call the constructor here
}