当前位置: 首页 > 知识库问答 >
问题:

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

施敏达
2023-03-14

以下作品

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个答案

林修真
2023-03-14

这个管用

class PagerAdapter(var tabCount: Int) : SomeBase() {
    override fun getCount() = tabCount
}  

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

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

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

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

虽然你不能像你尝试过的那样在方法中使用这样的参数,但是你需要一个属性。

常俊侠
2023-03-14

类PagerAdapter(tabCount: Int, fm: FragmentManager?)中的tabCountfm只是构造函数参数。它们不是类的成员。

就像

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
}  
南宫才英
2023-03-14

第二个不起作用,因为您没有为类声明任何属性。仅仅在括号中提到它们并不能使它们成为属性,相反,可以将它们进行比较,就好像它们只是构造函数的参数一样。

您可以使用varval。。。如果你愿意,你可以把它们变成私人的。

还请查看Kotlin关于类和继承的参考,更具体地说,是构造函数章节:

事实上,为了声明属性并从主构造函数初始化它们,Kotlin有一个简洁的语法:

class Person(val firstName: String, val lastName: String, var age: Int) { ... }

与常规属性一样,主构造函数中声明的属性可以是可变的var或只读的val

 类似资料:
  • 我想做一个简单的POJO(POKO?)在Kotlin中使用一个默认的空构造函数和一个带有参数的辅助构造函数创建一个类,该类提供属性 这并没有给我和属性: 这为我提供了属性,但它们在实例化后没有设置: 这给了我一个编译错误,说“不允许在二级构造函数参数上使用'var'”: 那么,这是怎么做到的?我如何拥有一个默认构造函数和一个带有参数和属性的二级构造函数?

  • 从Kotlin开始,想要创建一个数据类

  • 我创建了这个扩展方法,它从一个KClass获取所有属性 扩展方法 示例用法 结果 val公司。演示。富。酒吧:科特林。内景 val公司。演示。富。巴兹:科特林。一串 VARcom.demo.Foo.boo:kotlin。字符串? 如何修改此扩展方法以仅返回在主构造函数中声明的属性? 预期成果 val公司。演示。富。酒吧:科特林。内景

  • 我正在构建一个API并使用swagger测试endpoint。我有一个产品: 在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示: 但是由于私有设置器在类中使用,我无法使用swagger设置这些值(它在这些上具有属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为类设置值,并且仍然在属性上使用私有设置器?

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 在问我的问题之前,我想把一些事情说清楚。首先,我是Java和编程的新手。第二,这是我的第一个帖子,所以如果我做错了什么,请宽容对待我。最后,我不想要任何具体的解决办法,我的任务在任何回应这篇文章。这些问题要我来解决。我想要的是一个解释,为什么我的测试代码不能编译/运行。为了更好地理解这个问题,我将粘贴赋值信息,然后是给定的驱动程序类,然后是驱动程序类访问的我的类代码。我的编译器错误显示在标题中,但