5

我即将重载leftShift运算符并想知道如何检查给定参数“other”是否为String?

def leftShift(other){
    if(other.getClass() instanceof String){
        println other.toString() + " is a string!"          
}

但这不起作用..有人可以帮助我吗?

4

3 回答 3

13

您可以使用通常在 Java 中使用的测试。

def leftShift(other) {
    if(other instanceof String) {
        println "$other is a string!"
    }
}

当您调用other.getClass()结果类时,您可以将其与String.class进行比较的java.lang.Class实例。注意other可以为null,其中测试“other instanceof String”的计算结果为 false。

更新:

这是一个简单的案例,它创建了一个不是字符串实例的 Groovy GString实例:

def x = "It is currently ${ new Date() }"
println x.getClass().getName()
println x instanceof String
println x instanceof CharSequence

输出:

It is currently Thu Aug 21 15:42:55 EDT 2014
org.codehaus.groovy.runtime.GStringImpl
false
true

GStringImpl 扩展了 GString,它具有使其行为为 String 对象的方法,并像 String 类一样实现 CharSequence 接口。检查其他对象是否为 CharSequence,如果对象是 String 或 GS​​tring 实例,则为 true。

def leftShift(other) {
    if(other instanceof CharSequence) {
        println "$other is a string!"
    }
}
于 2012-12-14T14:43:48.943 回答
6

It is

if (other.getClass() == String)
于 2012-12-14T11:36:09.820 回答
1

编写的代码无法编译-您缺少大括号。就目前而言,instanceof正如其他人所提到的,它可以像在 Java 中一样工作。但是,在 Groovy 中,我会小心检查instanceofString因为有时看起来确实如此StringsGStrings请参阅文档,“GStrings are not Strings”部分)。快速示例:

assert "the quick brown $somevar jumped over the lazy dog" instanceof String == false
于 2012-12-14T14:49:12.903 回答