在androidjava/Kotlin中,实现接口是否使其能够直接访问嵌套类&x27;s局部变量

在androidjava/Kotlin中,实现接口是否使其能够直接访问嵌套类&x27;s局部变量,java,android,kotlin,Java,Android,Kotlin,在androidjava/Kotlin中,实现接口是否会让它直接访问嵌套类的局部变量。更具体地说,当访问嵌套类的局部变量时,它们是通过值或引用传递给接口的。我不清楚您指的是“外部类中的字段”还是“封闭方法中的局部变量”,但tl;dr是“一切都是参照的”。(很明显,原语不是通过引用,而是通过其他方式。) 局部内部类保存对外部类的引用。比如说, //Java 公共舱外{ 公共类内部工具供应商{ @覆盖公共外部get(){ 返回外部。这个; } } } 新建外部().新建内部().获取(); Ou

在androidjava/Kotlin中,实现接口是否会让它直接访问嵌套类的局部变量。更具体地说,当访问嵌套类的局部变量时,它们是通过值或引用传递给接口的。

我不清楚您指的是“外部类中的字段”还是“封闭方法中的局部变量”,但tl;dr是“一切都是参照的”。(很明显,原语不是通过引用,而是通过其他方式。)


局部内部类保存对外部类的引用。比如说,

//Java
公共舱外{
公共类内部工具供应商{
@覆盖公共外部get(){
返回外部。这个;
}
}
}
新建外部().新建内部().获取();
Outer$Inner
类有一个编译器生成的最终字段,名为
this$0
(编译器在构造时也会生成用于填充的代码),这就是
Outer。this
/
this@Outer
实际上是指

例如,访问外部类中的字段

//Java
公共舱外{
字符串=”;
公共类内部工具供应商{
@重写公共字符串get(){
返回字符串;
}
}
}
新建外部().新建内部().获取();
转换为遍历对外部的引用,例如
outer.this.string
/
this@Outer.string
。外部的方法调用也是如此


匿名内部类具有与本地内部类相同的功能,用于引用外部类,并且还可以访问创建它们的范围内的局部变量

//Java
公共舱外{
公共供应商内部(最终字符串){
退回新供应商(){
@覆盖公共外部get(){
返回字符串;
}
}
}
}
新的外部()内部(“”.get();
对于
final
局部变量的引用,Java编译器生成一个final字段来保存它们,并在构建内部类时填充它们。Java中不允许引用非
final
局部变量

Kotlin对
val
(如最终)变量执行此操作,另外还允许引用
var
(如非最终)变量

// Kotlin
class Outer {
    fun inner(string: String): () -> String {
        var string2 = string
        return { string2 }
    }
}
Outer().inner("").invoke()
如果匿名内部类使用
var
变量,则Kotlin编译器会将其每次访问转换为通过
Kotlin.jvm.internal.Ref
包装器。对这个包装的引用可以像对最终变量的引用一样传递。如果您在IntelliJ IDEA或Android Studio中使用Kotlin插件,IDE将在变量名下面加下划线,以指示自动进行包装



以上这些都不是特定于Android的,而是Java和Kotlin(JVM)的行为。(Kotlin JS和Kotlin native有不同的实现,但可观察到的行为仍然相同。)

请添加一个代码示例来说明您正在谈论的内容。您的问题太笼统了,请更具体一些。您可以将回调传递给嵌套类方法。例如:
foo({it})
。嵌套方法调用回调并将局部变量传递到lambda中的是局部变量。
// Kotlin
class Outer {
    var string: String = ""
    inner class Inner: () -> String {
        override fun invoke() = string
    }
}
Outer().Inner().invoke()
// Kotlin
class Outer {
    fun inner(string: String): () -> String {
        var string2 = string
        return { string2 }
    }
}
Outer().inner("").invoke()