Kotlin 不允许这样做:
private lateinit var port: Int;
我可以使用什么来将类似值的整数标记为允许延迟初始化?
我明白为什么这不起作用(Int 是原始的),我需要知道改用什么?
编辑 1
这不是重复的,因为我想知道在这种情况下使用什么,而不是为什么会发生:Why doesn't Kotlin allow to use lateinit with primitive types?
编辑 2
正如下面@Roland 所建议的那样——BitInteger 对我有用:
private lateinit var port: BigInteger;
我只是用它来生成一个 URL,所以我真的只需要在字符串连接中使用它。
最佳答案
我想到了一些变体,但取决于你以后如何使用它,没有一个可能适合你。
var port : Int = 8080
Number
-类型而不是Int
,例如class Server {
lateinit var port : Number
}
然后您可以调用
port.toInt()
如果你需要。但是:有很多Number
-types,因此将其缩小到例如BigInteger
可能有道理。否则你可能会得到你不想接受的对象。 Delegates.notNull
var port : Int by Delegates.notNull()
但是:即使您节省了
null
-value 然后,您无法检查变量是否已初始化,因此您只需在要访问它时立即处理异常...我认为这不是很好...但是如果您确定得到一个值,那么这对你来说也可以。 Int?
并跳过 lateinit
,例如:class Server {
var port : Int? = null
}
而不是
::port.isInitialized
你会要求 port != null
, 但是:你需要处理可能的 null
-现在的值,但使用 ?
这应该不是什么大问题。 Int?
与 Delegates.vetoable
如果您不想接受 null
-values 在您获得第一个值之后,使其基本上类似于 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
再简单不过了?
关于kotlin - 用于 lateinit Int 值的 Kotlin 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047833/