以下作品
class PagerAdapter(var tabCount: Int, fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
override fun getItem(p0: Int): Fragment {
return when (p0) {
0 -> TabFragment1()
1 -> TabFragment2()
2 -> TabFragment3()
else -> throw IllegalArgumentException("Invalid color param value")
}
}
override fun getCount() = tabCount
}
而这不是(未解决的参考:tabCount)
class PagerAdapter(tabCount: Int, fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
override fun getItem(p0: Int): Fragment {
return when (p0) {
0 -> TabFragment1()
1 -> TabFragment2()
2 -> TabFragment3()
else -> throw IllegalArgumentException("Invalid color param value")
}
}
override fun getCount() = tabCount
}
我是Kotlin的新手,只是感到困惑,为什么您不能在类本身中使用val属性。有人可以解释一下吗?谢谢
答案 0 :(得分:3)
第二个不起作用,因为您没有为该类声明任何属性。 仅在方括号中提及它们并不能使其具有属性,而是可以将它们视为只是构造函数的参数来进行比较。
您想使用var
或val
...如果愿意,可以将它们设置为private
。
还要检查Kotlins reference about classes and inheritance, more specifically the constructor chapter:
事实上,对于从主构造函数声明属性并对其进行初始化,Kotlin具有简洁的语法:
class Person(val firstName: String, val lastName: String, var age: Int) { ... }
与常规属性非常相似,在主构造函数中声明的属性可以是可变的
var
或只读的val
。
答案 1 :(得分:1)
tabCount
中的 fm
和class PagerAdapter(tabCount: Int, fm: FragmentManager?)
只是构造函数参数。
他们不是班级成员。
就像
class PagerAdapter extends FragmentStatePagerAdapter {
PagerAdapter(int tabCount, FragmentManager fm) {
super(fm)
}
...
}
在Java中。
您必须通过在它们前面添加val
来指定它们是类字段。
class PagerAdapter(val tabCount: Int, val fm: FragmentManager?) : FragmentStatePagerAdapter(fm) {
override fun getItem(p0: Int): Fragment {
return when (p0) {
0 -> TabFragment1()
1 -> TabFragment2()
2 -> TabFragment3()
else -> throw IllegalArgumentException("Invalid color param value")
}
}
override fun getCount() = tabCount
}
答案 2 :(得分:0)
这有效
class PagerAdapter(var tabCount: Int) : SomeBase() {
override fun getCount() = tabCount
}
因为当您为主构造函数参数指定var
或val
时,该参数成为该类的属性。
var
或val
指定参数,则不会存储该参数。但是,您仍然可以在init
块中使用该值:
class PagerAdapter(tabCount: Int) {
init {
Log.d("$tabCount")
}
}
或初始化一些自定义属性:
class PagerAdapter(tabCount: Int) {
val tabCountTenTimes: Int = tabCount * 10
}
尽管您不能像尝试过的那样在方法中使用这样的参数-为此您需要一个属性。