对 Groovy/Java 中的 `instanceof` 感到好奇

问题描述 投票:0回答:1

我在 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

java groovy instanceof
1个回答
0
投票

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) {
    ...
}

使用这种语法,显然您需要精确的类型而不是类引用

© www.soinside.com 2019 - 2024. All rights reserved.