Groovy – 类型检查,泛型不起作用

这是 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>和测试(没有通用参数)应该平等对待?

更新

我正在使用Groovy版本2.4.3并在GroovyConsole AppSpot准备了一个在线脚本来显示静态类型检查的不一致性.

解决方法

我认为这是一个错误.我尝试了原始和通用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.让我们看看会发生什么.

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...