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