提问人:shn 提问时间:7/19/2020 最后编辑:shn 更新时间:7/20/2020 访问量:145
为什么要在此代码中使用 this@MainActivity?
Why using this@MainActivity in this code?
问:
我在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()
}
答:
1赞
Nataraj KR
7/20/2020
#1
如果该行代码位于 lambda 内部或某个对象内部,或者在其他情况下;lambda 将具有对自身的引用,可以使用相同的关键字访问。因此,要指定适当的引用@,请指定范围名称作为标签。apply
this
所以基本上 label 用于指定其他 lambda 或内部类等内部类中的外部类的范围,
2赞
CommonsWare
7/20/2020
#2
您关注的行位于 lambda 表达式中,该表达式由 Kotlin 转换为 .
因此,在该 lambda 表达式的作用域中,是 ,而不是 .因此,我们需要标签来指示我们想要外部对象的表示形式。ViewSwitcher.ViewFactory
this
ViewSwitcher.ViewFactory
MainActivity
@MainActivity
MainActivity
this
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.ViewFactory
ViewSwitcher.ViewFactory
评论
MainActivity