Groovy - 为什么1位数字符串作为字符转换为int?

时间:2018-03-06 00:25:38

标签: groovy types

以下代码输出this.modules = { keyboard: { bindings: this.bindings }, formula: true, toolbar: true, counter: { container: '#counter', unit: 'word' }, equalsSymbol: { container: '#equalsBtn', selector: 'equals' }, impliesSymbol: { container: '#impliesBtn', selector: 'implies' } };

的惊人值
51

Groovy似乎将 int a = "3" println a // outputs 51 字符解释为3并继续。

为什么groovy不会抛出int?我怎么能阻止groovy忽略这些打字错误呢?

1 个答案:

答案 0 :(得分:5)

int a = "3"使用Groovy类型强制并将“3”自动转换为char并将其转换为ASCII整数值51.对于单个数字作为字符串(两个或更多个数字),此行为仅此类似将生成运行时错误)。此语句与int a = (char)"3"具有相同的结果。这种类型的无声bug可能很讨厌,但类型检查可以检测到这样的错误。

在Groovy中,您可以在类或方法级别启用静态类型检查。

@groovy.transform.TypeChecked
void run1() {
    int a = "3" // triggers type-check exception 
    println a
}

@groovy.transform.TypeChecked
void run2() {
    def a = '3' as int
    println a // outputs 3
}

run1()
run2()

静态类型检查强制严格compile-time type check

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
C:\java\groovy\Example.groovy: 3: [Static type checking]
 - Cannot assign value of type java.lang.String to variable of type int
 @ line 3, column 10.
        int a = "3" // triggers type-check exception
            ^