WeS*_*eSt 5 groovy typechecking
这是这个SO问题的后续内容。我将Groovy
脚本导入GroovyShell
到我的应用程序并设置TypeChecked
转换。但是,当与具有泛型类型的类配对时,静态类型检查不起作用。以下脚本引发编译时错误的方式Groovy
对我来说并不明显:
Integer x = (new Test<Integer>(5)).value // works as expected
Integer y = (new Test<Object>(new Object())).value // throws a COMPILE error as expected
Integer z = (new Test(new Object())).value // throws a RUNTIME exception
class Test<T> {
T value
public Test(T value){
this.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
最后一个赋值 ( Integer z = ...
)不会引发编译时错误,而是在运行时失败并带有GroovyCastException
. 有谁知道这种行为或者有一些指向文档相关部分的指针?到目前为止,我还没有发现任何东西。此外,我的理解是Test<Object>
and Test
(没有通用参数)应该被平等对待?
我使用的是2.4.3Groovy
版本,并在GroovyConsole AppSpot准备了一个在线脚本来显示静态类型检查的不一致之处。
我认为这是一个错误。我尝试了一个使用原始和通用 ArrayList 的不同示例。我也有同样的行为。
import groovy.transform.TypeChecked
@TypeChecked
class Test {
static method() {
ArrayList<Integer> integerArrayList = new ArrayList<>();
ArrayList rawArrayList = new ArrayList();
ArrayList<Object> objectArrayList = new ArrayList<>();
integerArrayList << 1;
rawArrayList << new Object();
objectArrayList << new Object();
Integer x = integerArrayList.get(0); // Case 1: works as expected
Integer y = rawArrayList.get(0); // Case 2: doesn't throw a compile error but should
Integer z = objectArrayList.get(0); // Case 3: throws a compile error as expected
}
}
Run Code Online (Sandbox Code Playgroud)
我提交了错误报告。请参阅TypeChecked 使用原始泛型类型时,Groovy 在编译时不会抛出非法赋值错误。让我们看看结果如何。