英文:
Class field with different argument types (setter overloading)
问题
在Kotlin中,你无法像在Java中那样直接将整数分配给Long字段,因为Kotlin会进行更严格的类型检查。你可以通过使用类型转换来实现这一功能。以下是你的代码的翻译部分:
class MyClass {
var myNumber: Long = 0L // 内部 setMyNumber(value: Long)
fun setMyNumber(newNumber: Int) {
myNumber = newNumber.toLong()
}
}
要将整数分配给myNumber
字段,你可以使用以下代码:
val myClass = MyClass()
myClass.myNumber = 4 // 这会调用setMyNumber(newNumber: Int)方法并将整数值分配给myNumber字段
这将调用setMyNumber(newNumber: Int)
方法,并将整数值分配给myNumber
字段。这样,你可以实现你的需求并保持属性表示法。
英文:
I have a class with a field of type long and I would like to pass either an Int or a Long value.
So I thought I can make a second setter with the same name, but different argument.
Kotlin does not complain and I can even call both setters from Java (same name, one automatically created with long from Kotlin). In Java I just call setMyNumber(long or int) value and the compiler will assign the correct method.
But why can't I do myNumber = 4
in Kotlin, why does it not call the other setter?
Is there a different way I can achieve this functionality, but still keep the property notation (yes I know I can write to setter methods, but then I have to call them with a method call rather just assigning a value)?
class MyClass {
var myNumber: Long = 0L // internal setMyNumber(value: Long)
fun setMyNumber(newNumber: Int) {
myNumber = newNumber.toLong()
}
}
答案1
得分: 2
截止到目前,你正在尝试的操作是不受支持的。 (参见: 允许属性的setter重载)
一个解决方法是使用超类来表示所有平台类的数值:
class MyClass {
var myNumber: Number = 0L
set (value) { field = value.toLong() }
}
val myClass = MyClass()
val anInt: Int = 1
val aLong: Long = 1L
myClass.myNumber = anInt
myClass.myNumber = aLong
英文:
As of writing, what you're trying to do is not supported. (See: Allow setters overloading for properties)
A workaround would be using the Superclass for all platform classes representing numeric values:
class MyClass {
var myNumber: Number = 0L
set (value) { field = value.toLong() }
}
val myClass = MyClass()
val anInt: Int = 1
val aLong: Long = 1L
myClass.myNumber = anInt
myClass.myNumber = aLong
[Try it online!](https://tio.run/##jU69CsIwEN7zFDcmS3FwkGAFcRKqi08QNS3B9CpJWiilz14vabspeMMdfN99P68mWIPT9LDKe7j0p3QHBjSdclD317a@aydhvpDDpkhsHK8D8E7ZVgsYoDTaPukhAVloigYrLmBkI2OsbBFqZZArV3kJR@dUv78FZ7A6iBRIMoqbC@RrFS7YQik8Y5BAi9jtCsYMCXETuivi8@KRrdWJSNovVGZ14FK@qUWwKH6po/0f6nGaPg "Kotlin – Try It Online")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论