科特琳不允许这样做:
private lateinit var port: Int;
我可以用什么来将类似value的整数标记为lateate?
我了解为什么不起作用(Int是原始的),我需要知道该用什么代替?
编辑1
这不是重复的,因为我想知道在这种情况下使用什么,而不是为什么发生:Why doesn't Kotlin allow to use lateinit with primitive types?
编辑2 如下面@Roland所建议-BitInteger为我工作:
private lateinit var port: BigInteger;
我正好用它来生成URL,所以我真的只需要在String串联中使用它。
答案 0 :(得分:1)
我不知道您要寻找的完美解决方案,但是我是这样做的(以防您实际上被迫使用原始类型):
class Example{
private var _port: Int? = null
var port:Int
get() = this._port!!
set(i) { _port = i }
}
至少,这使您可以使用该属性,就像不可为空一样。 到目前为止,我们为我们找到的最佳解决方案!
答案 1 :(得分:1)
我想到了一些变体,但是取决于以后使用的方式,可能都不适合您。
仅使用默认值,例如:
var port : Int = 8080
使用其他一些Number
类型而不是Int
,例如
class Server {
lateinit var port : Number
}
如果需要,您可以致电port.toInt()
。但是:Number
类型很多,因此将其范围缩小到例如BigInteger
可能有意义。否则,您可能会得到对象,而您根本不想接受。
使用Delegates.notNull
var port : Int by Delegates.notNull()
但是:即使您保留了null
值,也无法检查变量是否已初始化,因此,只要访问它就必须处理一个异常。 。我认为这不是很好...但是,如果您确定自己有一个价值,那对您也可以。
只需使用Int?
并跳过lateinit
,例如:
class Server {
var port : Int? = null
}
您会要求使用::port.isInitialized
而不是port != null
,但是:您现在需要处理可能的null
值,但是使用?
则不应该这样一个大问题。
将Int?
与Delegates.vetoable
一起使用,以防在获得第一个值后不想接受null
值,基本上使之类似于lateinit
;-)
class Server {
var port : Int? by Delegates.vetoable(null as Int?) {
_, _, newValue -> newValue != null
}
}
并使用port != null
再次检查,该行为现在类似于::port.isInitialized
并不是我是最后两个的忠实拥护者,因为他们再次介绍了null
,但是取决于您的工作,这可能是完全可以的...
在您添加了有关String
串联的内容时,我什至会在此处使用Int?
。然后,您仍然可以使用类似的内容:
url = "$host${port?.let { ":$it" }?:""}"
// or:
url = port?.let { "$host:$it" } ?: host
// or
url = listOfNotNull(host, port).joinToString(":")
::port.isInitialized
难道难道不难吗?
答案 2 :(得分:0)
如果您的项目不是跨平台的,则显而易见的解决方案是
Int
与BigInteger
值一一对应(不同于#=Comment#
)。