Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lateinit Int值使用什么Kotlin类型_Kotlin - Fatal编程技术网

lateinit Int值使用什么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,所以我只需要在字符串连接

Kotlin不允许这样做:

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