为什么Groovy没有捕捉到我的instanceof?

为什么Groovy没有捕捉到我的instanceof?,groovy,instanceof,Groovy,Instanceof,在以下代码中: static void main(String[] args) { String str if(str instanceof String) { println "'str' is a String!" } else { println "I have absolutely no idea what 'str' is." } } “我完全不知道‘str’是什么”这句话是什么意思为什么,我该怎么做才能让Groovy

在以下代码中:

static void main(String[] args) {
    String str

    if(str instanceof String) {
        println "'str' is a String!"
    } else {
        println "I have absolutely no idea what 'str' is."
    }
}

“我完全不知道‘str’是什么”这句话是什么意思为什么,我该怎么做才能让Groovy看到
str
是一个字符串(除了使字符串非null之外)?

因为
str
是null,而不是
字符串

instanceof关键字询问引用指向的对象,而不是引用类型

编辑

试试这个

static void main(args) {
    String str = 'King Crimson Rocks!'

    if(str instanceof String) {
        println "'str' is a String!"
    } else {
        println "I have absolutely no idea what 'str' is."
    }
}

你的问题中的“除了使字符串非空”部分意味着答案是没有办法做你所问的事情。您不能在运行时询问局部变量引用并询问其声明的类型。语言不能解释这一点,因为没有很好的理由这样做。您在编译时已经知道声明的类型。没有理由询问局部变量引用并询问其声明的类型。我发布的答案解决了相关问题。希望澄清一下,当我说没有理由询问局部变量引用并询问其声明的类型时,我的意思是明确的。不要误以为您可能不想在堆上查询对象并了解其类型,但您的问题明确表示您不想使用“除了使字符串为非null之外”限定符。为什么您希望在运行时查询局部变量引用的声明类型?感谢@JeffScottBrown-我希望在每个变量声明之后使用instanceof,以确保运行时确实为我提供了我刚才要求的正确类型。有点像我对“防御性编码”的看法。另外,OPs代码甚至不在java中编译;在groovy中,它是一个
空对象
——我会感到困惑epitaph@cfrick“OPs代码甚至不在java中编译”-它是Groovy代码,而不是java代码。它不会编译为java代码或C++或任何其他语言的事实似乎并不相关。我是否误解了最初的问题或您的评论?我看到您在我询问后编辑了您的评论,但我仍然不确定为什么它与代码不会编译为Java相关。我认为不是。但是,如果java抛出了
错误:变量str可能没有被初始化
,这可能是更多的证据,证明它不能被初始化。这是一个很好的方式来加入一些国王深红色的参考。