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