如何在Groovy中检查实例的类型是String还是GString

如何在Groovy中检查实例的类型是String还是GString,groovy,types,Groovy,Types,我想了解一下,如果变量是string或gstring类型,那么健壮的检查方法是什么。我认为它与纯Java中的不同: def var = someFunc(); if (var instanceof String || var instanceof GString) { String str = var; } 我这样问是因为我不想因为错过了Groovy特有的功能而感到惊讶,因为它会导致难以调试的bug。Instanceof tests应该可以工作: assert "fasd" insta

我想了解一下,如果变量是string或gstring类型,那么健壮的检查方法是什么。我认为它与纯Java中的不同:

def var = someFunc();

if (var instanceof String || var instanceof GString) {
   String str = var;
}

我这样问是因为我不想因为错过了Groovy特有的功能而感到惊讶,因为它会导致难以调试的bug。

Instanceof tests应该可以工作:

assert "fasd" instanceof String
assert "${this}" instanceof GString

您还可以在Groovy对象上使用
.class
方法

def a = "test"
def b = "${a}"

assert a.class == String
assert b.class == org.codehaus.groovy.runtime.GStringImpl
请注意,
GString
很容易计算并转换为
字符串,例如通过调用
toString

如果您正在寻找类似模板的功能,使其具有可重用的字符串定义来传递和使用,则应该考虑<代码> Groovy 模板引擎。


参见

另一种方法是在
关键字中使用

groovy:000> t = "hello"
===> hello
groovy:000> t in String
===> true
groovy:000> "${t}" in GString
===> true
中的
关键字是成员资格运算符,并被转换为类上的
isCase
调用:

groovy:000> String.isCase(t)
===> true
groovy:000> GString.isCase("${t}")
===> true

您必须小心的是,
a
是一个
Map
但是,因为
a.class
将返回
null
令人失望的是,没有更简洁的方法来执行此操作,例如var.isString()