我在 Groovy 中遇到了
instanceof
问题,发现 Class
无法通过变量定义,但 isCase
或 isAssignableFrom
可以按预期工作。
详细信息如下:
// works
assert '' instanceof java.lang.String
// not working
Class clz = ''.getClass()
assert '' instanceof clz // ERROR: unable to resolve class clz
assert '' in clz // works
// debug info:
println clz // class java.lang.String
println clz.getClass() // class java.lang.Class
isCase()
和 isAssignableFrom()
有效,我认为因为这两个是 function
Class clz = ''.getClass()
// works
assert clz.isCase( '' )
assert clz.isCase( [] ) == false
// works
assert clz.isAssignableFrom( ''.getClass() )
assert clz.isAssignableFrom( [:].getClass() ) == false
但是为什么
instanceof
不能使用类类型变量呢?顺便说一下,groovy 版本是 Groovy Version: 4.0.18 JVM: 21.0.2 Vendor: Homebrew OS: Mac OS X
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.20.2
也许最好的解释就在这里^^^
instanceof
运算符在编译时和运行时工作。要在编译时进行检查,需要准确的类名。
更多,从jdk 16开始有一个新的语法(https://openjdk.org/jeps/394)
而不是
if (obj instanceof String) {
String s = (String) obj;
...
}
你可以使用
if (obj instanceof String s) {
...
}
使用这种语法,显然您需要精确的类型而不是类引用