Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
Variables 为什么我要在Kotlin中指定变量的数据类型,如果最初给它赋值,它能够推断变量的数据类型_Variables_Kotlin - Fatal编程技术网

Variables 为什么我要在Kotlin中指定变量的数据类型,如果最初给它赋值,它能够推断变量的数据类型

Variables 为什么我要在Kotlin中指定变量的数据类型,如果最初给它赋值,它能够推断变量的数据类型,variables,kotlin,Variables,Kotlin,如所提供的代码中所述。我的问题是,当我只是给变量赋值时,尽早提到数据类型是否有任何好处。如第2行所述,它可以理解为int类型 val a: Int = 1 // immediate assignment val b = 2 // `Int` type is inferred val c: Int // Type required when no initializer is provided. 您可能希望显式指定类型的几个原因: 您需要一个值的超类型(也许这样您可以在以后重新分配它)

如所提供的代码中所述。我的问题是,当我只是给变量赋值时,尽早提到数据类型是否有任何好处。如第2行所述,它可以理解为int类型

val a: Int = 1  // immediate assignment
val b = 2   // `Int` type is inferred
val c: Int  // Type required when no initializer is provided.

您可能希望显式指定类型的几个原因:

  • 您需要一个值的超类型(也许这样您可以在以后重新分配它),例如:

    var myList:List=ArrayList()

  • 您希望防止对其他代码的更改(特别是在您无法控制的情况下),例如:

    val x:MustBeThisType=SomeLibrary.getValue()

    (如果
    SomeLibrary.getValue()
    更改为返回除
    MustBeThisType
    或子类型以外的内容,则会出现错误。)

  • 您希望避免显式数字转换,例如:

    val x:Long=2

    而不是:

    val x=2.toLong()

  • 您希望让阅读您的代码的人非常清楚(特别是在IDE中可能不存在代码的情况下)

  • 正如Michael所说,您可能需要指定从Java返回的类型的可空性,例如:

    val x:String=someJavaClass.getAString()//从不返回null


但是,在我的经验中,这些都不是特别常见的。

指定类型(但不是Int和Int文本)有时更具可读性。如果您希望类型不是所推断的类型(例如,超级类或超级接口),那么它也很有用。除了代码的可读性更好之外,还有其他优势吗?当与Java进行互操作时,Kotlin编译器可能并不总是能够推断来自Java的对象的可空性。因此,您可能需要编写
valfoo:foo?=getFooFromJava()
如果您知道
getFooFromJava
可以返回
null
引用(另一种选择是在Java代码中添加注释,如果修改Java代码是一个选项)。