Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.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
Kotlin 为什么MyClass::class.java.simpleName可以';这不是常数吗?_Kotlin - Fatal编程技术网

Kotlin 为什么MyClass::class.java.simpleName可以';这不是常数吗?

Kotlin 为什么MyClass::class.java.simpleName可以';这不是常数吗?,kotlin,Kotlin,正常val正常,并已初始化 class-MyClass{ 伴星{ private val TAG=MyClass::class.java.simpleName } } 但是const val会导致编译错误 class-MyClass{ 伴星{ private const val TAG=MyClass::class.java.simpleName } } 错误日志 MyClass.kt:27:33: error: const 'val' initializer should be a con

正常
val
正常,并已初始化

class-MyClass{
伴星{
private val TAG=MyClass::class.java.simpleName
}
}
但是
const val
会导致编译错误

class-MyClass{
伴星{
private const val TAG=MyClass::class.java.simpleName
}
}
错误日志

MyClass.kt:27:33: error: const 'val' initializer should be a constant value
        private const val TAG = MyClass::class.java.simpleName

不能将
simpleName
定义为
const val

const
关键字用于定义编译时常量,但
val
可以具有运行时常量,这似乎是不直观的。simplename在编译时不可用,因此会出现错误。

Kotlin
中,只有当值是编译时常量时才应使用
const
关键字。这里的
MyClass::class.java.simpleName
不是编译时常量。因此我们需要使用
val
而不是
const
val
与Java中的
final
关键字相同

欲了解更多信息,请查看

反射是一种语言在运行时检查和动态调用类、方法、属性等的能力

反射不能在编译时使用,它们只在运行时可用,因此不能使用
::class
::class.java
,它们在编译时不可用

const
修饰符将val标记为编译时常量。因此,不能在编译时调用任何运行时函数