def ~= 对象
正如 Tim 所指出的,def 不是 Object 数据类型的别名,但它可以作为一个(Object 是一个类,而 def 只是Groovy 关键字) - http://www.groovy-lang.org/semantics.html#_variable_definition def 与 Object 唯一的共同点是,在 JVM 级别上,每个 def 语句或类型替换都会编译为 Object,
考虑非常简单的test.groovy 脚本,其内容如下:
def name = "John"
String surname = "Doe"
println "$name $surname"
如果你把它编译成test.class,看看反编译后的代码,你会看到:
Compiled from "test.groovy"
public class test extends groovy.lang.Script {
public static transient boolean __$stMC;
public test();
LocalVariableTable:
Start Length Slot Name Signature
4 4 0 this Ltest;
public test(groovy.lang.Binding);
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this Ltest;
0 9 1 context Lgroovy/lang/Binding;
public static void main(java.lang.String...);
LocalVariableTable:
Start Length Slot Name Signature
0 19 0 args [Ljava/lang/String;
public java.lang.Object run();
LineNumberTable:
line 1: 4
line 3: 9
line 5: 14
LocalVariableTable:
Start Length Slot Name Signature
0 63 0 this Ltest;
7 56 2 name Ljava/lang/Object;
12 51 3 surname Ljava/lang/String;
protected groovy.lang.MetaClass $getStaticMetaClass();
}
IDE 语法支持
如果您使用支持 Groovy 的 IDE(例如 IntelliJ IDEA),那么您应该能够使用类型推断,并且 IDE 将为您提供语法支持。
def关键字的用途
def 的主要目的是在 Groovy 中引入动态类型。正如您在上面的示例中看到的,这仍然是旧的 Java Object 类型。
当您有意使用静态类型时,最好使用静态类型。出于文档原因,您的公共 API 绝对应该使用静态类型。我个人在两种情况下不时使用def:
- 在范围和变量名非常有限的局部变量中提供了有关变量本身的所有信息
- 在测试用例名称中的 Spock 单元测试中,例如
def "should do something"() { }