lateinit Int值使用什么Kotlin类型
Kotlin不允许这样做:lateinit Int值使用什么Kotlin类型,kotlin,Kotlin,Kotlin不允许这样做: private lateinit var port: Int; 我可以使用什么将类似整数的值标记为allow to lateinit 我理解为什么这不起作用(Int是基本的),我需要知道使用什么来代替它 编辑1 这不是重复,因为我想知道在这种情况下使用什么,而不是它发生的原因: 编辑2 正如下面@Roland所建议的,比廷杰为我工作: private lateinit var port: BigInteger; 我正在使用它生成一个URL,所以我只需要在字符串连接
private lateinit var port: Int;
我可以使用什么将类似整数的值标记为allow to lateinit
我理解为什么这不起作用(Int是基本的),我需要知道使用什么来代替它
编辑1
这不是重复,因为我想知道在这种情况下使用什么,而不是它发生的原因:
编辑2
正如下面@Roland所建议的,比廷杰为我工作:
private lateinit var port: BigInteger;
我正在使用它生成一个URL,所以我只需要在字符串连接中使用它。我不知道您正在寻找的完美解决方案,但我是这样做的(如果您实际上被迫使用原语类型): 至少这允许您将属性当作不可为null来使用。
迄今为止,我们为我们找到的最佳解决方案 我想到了一些变体,但取决于您以后如何使用,可能没有一个适合您
var port : Int = 8080
数字
-类型而不是Int
,例如
class Server {
lateinit var port : Number
}
然后,如果需要,可以调用port.toInt()
。但是:有很多Number
-类型,因此将其缩小到例如biginger
可能是有意义的。否则您可能会得到对象,而您首先不想接受Delegates.notNull
var port : Int by Delegates.notNull()
但是:即使您保留了null
-值,也无法检查变量是否已初始化,因此您只需在想要访问它时立即处理异常。。。不太好,我想。。。但是如果你确信你得到了一个值,那么对你来说也没关系Int?
并跳过lateinit
,例如:
class Server {
var port : Int? = null
}
而不是::port.i初始化
您将要求端口!=null
,但是:您现在需要处理可能的null
-值,但是使用?
这应该不是什么大问题Int?
和Delegates.vetoable
以防在获得第一个值后不接受null
-值,使其基本类似于lateinit
;-)
然后使用port!=null
,它现在的行为类似于::port.i初始化null
,但这取决于您所做的,这可能是完全正确的
当您添加了一些关于String
串联的内容时,我更愿意在这里使用Int?
。然后,您仍然可以使用以下内容:
url = "$host${port?.let { ":$it" }?:""}"
// or:
url = port?.let { "$host:$it" } ?: host
// or
url = listOfNotNull(host, port).joinToString(":")
如果您的项目不是跨平台的,那么显而易见的解决方案是
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") lateinit var i: java.lang.Integer
它与
Int
值有一对一的对应关系(不同于biginger
)。Hm,这似乎是一个任意的限制。好像Int?
是不允许的。你不能延迟可为空的类型,所以Int?
不起作用。可能是@marstran的重复-不是重复,我特别说我理解它为什么不起作用,这个问题回答得很好。我想知道该怎么做。如果你真的想保持Int
并且不想要默认值,你可以将它包装起来。。。或者使用其他类型,例如,biginger
?;-)查看我的编辑,我实际上将其改为biginger
,它对我来说很好(我使用它生成URL,所以我只是将其转换为字符串)。如果我需要实际的Int
值,也许我可以使用BigInteger并强制转换它。@mikeb是的,我看到了,但我希望在某些情况下,你不能这样做
url = "$host${port?.let { ":$it" }?:""}"
// or:
url = port?.let { "$host:$it" } ?: host
// or
url = listOfNotNull(host, port).joinToString(":")
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") lateinit var i: java.lang.Integer