这是this SO question的后续行动。我通过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
}
}
最后一个分配(Integer z = ...
)不会抛出编译时错误,而是在运行时失败GroovyCastException
。有没有人知道这种行为或有一些指向文档的相关部分?到目前为止,我还没有找到任何东西。此外,我的理解是Test<Object>
和Test
(没有通用参数)应该被平等对待?
我正在使用Groovy
版本 2.4.3 ,并在GroovyConsole AppSpot准备了一个在线脚本,以显示静态类型检查的不一致。
答案 0 :(得分:0)
我认为这是一个错误。我尝试了原始和通用ArrayLists的不同示例。我得到了同样的行为。
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
}
}
我提交了一份错误报告。见TypeChecked Groovy does not throw illegal assignment error at compile time when using raw generic type。让我们来看看会发生什么。