Variables 为什么我要在Kotlin中指定变量的数据类型,如果最初给它赋值,它能够推断变量的数据类型
如所提供的代码中所述。我的问题是,当我只是给变量赋值时,尽早提到数据类型是否有任何好处。如第2行所述,它可以理解为int类型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. 您可能希望显式指定类型的几个原因: 您需要一个值的超类型(也许这样您可以在以后重新分配它)
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代码是一个选项)。