通常,我们可以在kotlin中编写下面的代码: val hasValue : Boolean @JvmName(“hasValue”) get() = true 这将为Java interop生成方法hasValue()而不是getHasValue() 。 但是,在一个接口,这给了我一个编译错误: val hasValue : Boolean @JvmName(“hasValue”) get 抽象类中的以下声明也是如此: abstract val hasValue : Boolean @JvmName(“hasValue”) get 所以这里是我的问题:如何告诉kotlin编译器使用hasValue()而不是getHasValue()来获取kotlin接口中属性的getter(和setter)?
num在设置时应该是可以为空的,但是它返回的值应该总是不可空的(有一个默认值)。 class Test { var num: Int? = null get() = field ?: 5 // default value if null } 即使返回的值总是非空,这对我来说是合理的,因为这种类型不是推断出来的,而是从后台字段中得到的: val a: Int = Test().num 类型不匹配:推断类型是Int? 但国际预期 问题是如何将该getter的返回类型更改为不可空? 如果我这样做,编译器说: Getter返回类型必须等于属性的类型,即“Int?” 我知道我可以用另一个属性numNotNullable (没有后台字段)解决它。 class Test { var num: Int? = null get() = field ?: 5 // default value if null val numNotNullable: Int get() […]
为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法? 在我们的程序过程中真的被使用了吗? 我们还可以让它在没有它的情况下工作吗(没有改变公有的私有属性)? 当我们使用set和get方法时,这是一个源代码的例子: public class Dog { private String dogName; private int dogAge; public Dog(String dogName, int dogAge) { this.dogName = dogName; this.dogAge = dogAge; } public String getDogName() { return dogName; } public void setDogName(String dogName) { this.dogName = dogName; } public int getDogAge() { return dogAge; } public void setDogAge(int dogAge) { […]
我是kotlin新手,无法弄清楚这个问题。 我有一个不可空的财产,可能会或可能不会使用。 因此,我已经委派了一个懒惰的方式,以便在需要时进行初始化。 private val labelAnimator: ObjectAnimator by lazy { ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) } 但是,我也需要在每次访问时设置该对象的某些属性。 fun getLabelAnimator(): ObjectAnimator { labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() return labelAnimator } 但是我不能使用自定义的getter,因为这个属性是委托的。 我如何以最好的方式实现这一点?
我已经将数据类定义为: data class chatModel(var context:Context?) { var chatManger:ChatManager?=null //getter get() = chatManger //setter set(value) { /* execute setter logic */ chatManger = value } } 现在我将如何访问get()和set()函数。 在Java中,我喜欢://对于getter new chatModel().getJId() //对于setter new chatModel().setJId("jid") 编辑: 正如@yole所建议的那样。 我正在使用setter和getter: //设置数据 var chatDetails:chatModel=chatModel(mApplicationContext) chatDetails.chatManger=chatManager 但最终得到java.lang.StackOverflowError:at com.example.itstym.smackchat.Model.chatModel.setChatManger(chatModel.kt:38) 第38行指向 chatManger = value 这个。 @RobCo建议。 我已经将数据类定义更改为: data class chatModel(var context: Context?) { var […]
我是Kotlin的新手,我尝试将一个小型的Java项目改为这种新的语言。 我在我的项目中使用mongodb,我有一个类,例如: class PlayerEntity { constructor() {} //for mongodb to create an instance constructor(id: ObjectId, name: String) { //used in code this.id = id this.name = name } @org.mongodb.morphia.annotations.Id var id: ObjectId? = null var name: String? = null } 我必须将id字段标记为空( var id: ObjectId? ),因为空的构造函数。 当我尝试从另一个类访问这个字段时,我必须使用非null检查: thePlayer.id!! 。 但是我的应用程序的逻辑是id字段永远不为null(mongo创建Player实例并立即设置id字段)。 而且我不想在任何地方进行非空的检查。 我试图做一个非null的getter,但它不能编译: var id: ObjectId? = […]
有什么方法可以重新命名Kotlin中的默认获取器和设置器? 我有一个名为snake_case的属性,但我仍然希望getter和setter在camelCase命名。 我得到的最接近的是类似的东西 private var property_name = Color.BLACK private set fun setPropertyName(c: Color) { property_name = c } fun getPropertyName() = property_name 有没有办法做到这一点,而不隐藏获取和设置和定义新的方法?
我开始和Kotlin一起玩,并且用自定义的getter读了一些关于mutable val的东西。 正如在这里或在Kotlin编码公约中所提到的,如果结果可以改变的话,不应该重写getter。 class SampleArray(val size: Int) { val isEmpty get() = size == 0 // size is set at the beginning and does not change so this is ok } class SampleArray(var size: Int) { fun isEmpty() { return size == 0 } // size is set at the beginning but can also change […]
我正在学习Kotlin,目前使用的是Fedora 25 OpenJDK 8和Kotlin 1.1。 我复制了Kotlin网站的示例: https : //kotlinlang.org/docs/reference/delegated-properties.html并更改了get运算符。 class Example { var p: String by Delegate() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { // My implementation return property.getter.call(thisRef) as String } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } […]