Kotlin构造函数属性val不能在类中使用

时间:2018-11-02 13:46:28

标签: android kotlin constructor

以下作品

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属性。有人可以解释一下吗?谢谢

3 个答案:

答案 0 :(得分:3)

第二个不起作用,因为您没有为该类声明任何属性。 仅在方括号中提及它们并不能使其具有属性,而是可以将它们视为只是构造函数的参数来进行比较。

您想使用varval ...如果愿意,可以将它们设置为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中的

fmclass 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
}  

因为当您为主构造函数参数指定varval时,该参数成为该类的属性。


但是,如果您不使用varval指定参数,则不会存储该参数。但是,您仍然可以在init块中使用该值:

class PagerAdapter(tabCount: Int) {
    init {
        Log.d("$tabCount")
    }
}  

或初始化一些自定义属性:

class PagerAdapter(tabCount: Int) {
    val tabCountTenTimes: Int = tabCount * 10
}

尽管您不能像尝试过的那样在方法中使用这样的参数-为此您需要一个属性。