为什么要在此代码中使用 this@MainActivity?

Why using this@MainActivity in this code?

提问人:shn 提问时间:7/19/2020 最后编辑:shn 更新时间:7/20/2020 访问量:145

问:

我在MainActivity类中看到了这样的代码:

class MainActivity : AppCompatActivity() {
    private val languages = arrayOf("One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten")
    private var index = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textSwitcher.setFactory {

            val textView = TextView(this@MainActivity) //the line I was 
                                                       //talking about.

            textView.gravity =  Gravity.CENTER_HORIZONTAL
            textView.textSize = 32f
            textView.setTextColor(Color.BLACK)
        }
        textSwitcher.setText(languages[index])
    }
}

但我没有得到它。“this”关键字已经不代表 MainActivity?如果是这样,为什么需要标签?

我编写了该代码来理解“this”关键字。

class class1(c:class2){
    init{
        c.output()
    }
}
class class2{
    init{
        class1(this) // this" keyword represent the class2
    }
    fun output(){
        println("Hello.")
    }
}
fun main(){
    val x = class2()
}
Android Kotlin 标记此 内容

评论

0赞 CommonsWare 7/19/2020
“”this“ 关键字已经不代表 MainActivity?” -- 不一定。这取决于那条线在哪里。但是,鉴于只有一行代码,很难进一步为您提供帮助。您可以考虑编辑您的问题,以便您的最小可重现示例显示整个 ,包括与您相关的行。MainActivity
0赞 shn 7/20/2020
谢谢。实际上,我试图将代码减少到最低水平,但我进行了编辑。

答:

1赞 Nataraj KR 7/20/2020 #1

如果该行代码位于 lambda 内部或某个对象内部,或者在其他情况下;lambda 将具有对自身的引用,可以使用相同的关键字访问。因此,要指定适当的引用@,请指定范围名称作为标签。applythis

所以基本上 label 用于指定其他 lambda 或内部类等内部类中的外部类的范围,

2赞 CommonsWare 7/20/2020 #2

您关注的行位于 lambda 表达式中,该表达式由 Kotlin 转换为 .因此,在该 lambda 表达式的作用域中,是 ,而不是 .因此,我们需要标签来指示我们想要外部对象的表示形式。ViewSwitcher.ViewFactorythisViewSwitcher.ViewFactoryMainActivity@MainActivityMainActivitythis

https://developer.android.com/reference/kotlin/android/widget/ViewSwitcher?hl=en#setfactory

评论

0赞 shn 7/20/2020
我不知道为什么我不明白。但我认为是这样。setFactory 是一个高阶函数。如果我写“this”,它会检测 HOF 中的值作为参考。右?对不起,我的英语不好。
0赞 CommonsWare 7/20/2020
@Furkan:“setFactory 是一个高阶函数”——不是真的。它是一个将 Java 接口对象作为参数的函数。这里的代码使用 Kotlin SAM(单一抽象方法)支持将 lambda 表达式转换为该 Java 接口的实例。“它检测 HOF 中的值作为参考”——对不起,但我不知道 HOF 在这种情况下是什么意思。
0赞 shn 7/20/2020
这也是一个令人困惑的问题。你是怎么发现setFactory是一个SAM的?它不会在 Android 引用中写入任何内容(如 SAM 或高阶函数)。我所知道的 SAM 是 Java 接口。
0赞 shn 7/20/2020
当我进入这里时,我看到一个公开班级(据我所知,山姆不可能来自班级。我没有看到界面。当我看这里时,有一个界面,是的。但是没有 setFactory 方法。所以如果它是“setFactory”,我会说它是 SAM。你怎么能说“这是SAM”?我希望我能说出来。我把 HOF 缩短为 Higher Order Function。
1赞 CommonsWare 7/20/2020
@Furkan:“你是怎么发现setFactory是SAM的?”--是一个方法。它以 a 作为参数。ViewSwitcher.ViewFactory 是一个具有单个抽象方法的 Java 接口。因此,可以使用 Kotlin SAM 支持来创建实例。setFactory()ViewSwitcher.ViewFactoryViewSwitcher.ViewFactory