kotlin - 为什么我使用 Kotlin“is”操作符会出现“不兼容的类型”错误
问题描述
我一直在尝试在 Kotlin 中获取变量的类型,我发现可以这样做:
fun main(args: Array<String>) {
var num1: Short = 1
var num2 = 100000
var num3 = 1000000000000
var num4 = 3.14
val numList: List<Any> = listOf(num1, num2, num3, num4)
for(num in numList) {
if (num is Short) {
println("Short: $num")
} else if (num is Int) {
println("Int: $num")
} else if (num is Long) {
println("Long: $num")
} else {
println("$num not in listed types")
}
}
}
Output:
Short: 1
Int: 100000
Long: 1000000000000
3.14 not in listed types
...但我不能这样做:
fun main(args: Array<String>) {
var num2 = 100000
if (num2 is Long) {
println("Long: $num2")
} else {
println("$num2 not in listed types")
}
}
Output:
Kotlin: Incompatible types: Long and Int
为什么?有什么区别?
解决方案
请注意, 中的元素numList
具有编译时类型Any
:
val numList: List<Any> = listOf(num1, num2, num3, num4)
^^^
换句话说,num
这里是类型Any
:
for(num in numList) {
^^^
检查是否num
实际存储 aLong
是允许的,因为编译器 只知道它的类型是Any
。它实际上可以Long
在运行时存储 a 。
另一方面,当您声明和初始化 时num2
,它的类型被推断为Int
,因为100000
是Int
文字。编译器知道num2
永远不能在运行时存储 aLong
因为它的类型是Int
.
如果你使用Long
文字100000L
,那么你的代码会编译,你会得到一个警告,说它num2 is Long
总是正确的。
推荐阅读
- ubuntu-16.04 - 如何安装 python-pybind11?
- javascript - (巴雷拉斯 - 巴西,马什哈德 - 伊朗)等国家/地区的时区缩写为 -03,+330,而不是 BRT 和 IRST
- c# - 能够在本地下载文件,但不能从 Azure
- xslt - 如何在 xslt 转换中转换肥皂故障消息
- java - 出现此错误的“没有 GET 映射”的原因是什么?
- reactjs - 页面重新加载导致 redux 状态变为 DEFAULT (REACT/REDUX)
- mysql - MySQL选择分组整数的范围
- android - 如何解决:java.lang.IllegalStateException:无法执行此操作,因为连接池已关闭?
- php - 如何以卢比设置印度的产品价格,以美元设置印度的产品价格?
- oracle - 如何为 Oracle Forms 上的显示标签制作包装内容按钮