这是
this SO question的后续内容.我通过GroovyShell将Groovy脚本导入到我的应用程序并设置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>和测试(没有通用参数)应该平等对待?
更新
解决方法
我认为这是一个错误.我尝试了原始和通用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.让我们看看会发生什么.