在Android Java / Kotlin中,是否实现了一个接口直接访问嵌套类的本地变量

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

我不清楚你的意思是“外部的领域”还是“封闭的方法中的本地化”,而tl; dr是“一切都是参照的”。 (呃,显然原始人不是通过引用,而是其他一切。)


本地内部类拥有对外部类的引用。 例如,

 // Java public class Outer { public class Inner implements Supplier<Outer> { @Override public Outer get() { return Outer.this; } } } new Outer().new Inner().get(); 
 // Kotlin class Outer { inner class Inner: () -> Outer { override fun invoke() = this@Outer } } Outer().Inner().invoke() 

Outer$Inner类有一个编译器生成的最终字段,名称为this$0 (编译器在生成时也生成代码),这是Outer.this / this@Outer实际引用的内容。

例如访问外部类中的字段

 // Java public class Outer { String string = ""; public class Inner implements Supplier<String> { @Override public String get() { return string; } } } new Outer().new Inner().get(); 
 // Kotlin class Outer { var string: String = "" inner class Inner: () -> String { override fun invoke() = string } } Outer().Inner().invoke() 

被翻译成通过对外部的引用,例如Outer.this.string / this@Outer.string 。 与外部的方法调用同上。


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

 // Java public class Outer { public Supplier<String> inner(final String string) { return new Supplier<String>() { @Override public Outer get() { return string; } } } } new Outer().inner("").get(); 

为了引用final局部变量,Java编译器生成一个最终字段来保存它们,并在构建内部类时填充它们。 Java中不允许引用非final本地变量。

Kotlin为val (例如final)变量做这个事情,另外允许引用var (例如非final)变量。

 // 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本机有不同的实现,但可观察的行为仍然是相同的。)