我在Kotlin中创建了一个数据类
data class User(val name: String, val age: Int)
{
constructor(name: String, age: Int, size: String): this(name, age) {
}
}
在我的main函数中,我可以这样访问对象:
fun main(){
val x = User("foo", 5, "M")
println(x.name)
println(x.age)
println(x.size) // does not work
}
我的问题是无法访问size
。
我尝试做的是,创建一个data class
,其中顶层参数是将被访问的公共项,并且在构造函数中,具有适合特定情况的附加参数。
// something along the lines of
if (!haveSize()){
val person = User("foo", 5, "M")
} else {
val person = User("foo", 5)
}
}
有什么想法吗?
4条答案
按热度按时间ru9i0ody1#
在Kotlin中,你不需要单独的构造函数来定义可选的构造函数参数。你可以在一个构造函数中定义所有的构造函数参数,使用默认值,或者使它们可以为空,如下所示:
第一个
w9apscun2#
您不能访问大小变量,因为它来自二级结构,但我们有替代变量
umuewwlo3#
简而言之,您希望有一个属性可以作为有限数量的选项之一,这可以使用generics或sealed inheritance来解决。
泛型
这里我添加了一个接口
MountDetails
,它带有一个泛型参数T
,还有一个属性val c
,它的类型是T
。因为实现
MountDetails
(MountOneDetails
和MountTwoDetails
)将T
的类型指定为Int
或String
,所以val c
始终可以被访问。输出量:
泛型也有缺点,如果有很多泛型参数,就会很混乱,而且由于类型擦除,在运行时很难确定类的类型。
密封继承
由于挂载细节的数量有限,因此sealed classes and interfaces是一个更简洁的解决方案。
这样做的好处是类更少,类型更具体。添加或删除额外的挂载细节也很容易,任何详尽的
when
语句都会导致编译器错误。输出量:
ovfsdjhp4#
这实际上是Hubert Grzeskowiak根据您的示例给出的“默认值”答案: