1

我正在尝试“修改”我一直在升级的其他一些代码。

我将其归结为一个简单的示例泛型类,然后使用该类。

首先,我像这样声明了一个通用参数化类

//generic class 
class WillsAgent<T> {

    public  WillsAgent(T data) {//do nothing with this }
}

然后一个消费类尝试像这样使用它

@CompileStatic
public abstract class Test<T> {



    public WillsAgent<T> agent( T state) {
        final WillsAgent<T> safe = new WillsAgent<T> (state)
        return safe
    }
}

在使用@CompileStatic 声明的情况下,IDE 在 (state) 下显示一个红色波浪线,将参数传递给构造函数,如下所示

截屏

如果我注释掉 @CompileStatic 声明 - 错误就会消失

如果我将鼠标悬停在曲线上(启用@CompileStatic),它会显示:Constructor 'WillsAgent' in 'groovyx.gpars.agent.WillsAgent<T>' cannot be applied to '(T)'

除了删除 @CompileStatic 之外,我不知道如何解决这个问题

有没有人知道为什么它会抱怨这个以及如何解决它?

4

1 回答 1

1

快速修复:替换以下行:

final WillsAgent<T> safe = new WillsAgent<T>(state)

和:

final WillsAgent<T> safe = new WillsAgent(state)

第一行的问题可能是由 IntelliJ IDEA 的 Groovy 插件引起的。我尝试new WillsAgent<T>(state)使用 groovyc 进行编译,但没有抛出任何错误。此外,如果您在 IDE 中编译该类,它也可以毫无错误地编译。

好消息是,无论您编译new WillsAgent<T>(state)还是new WillsAgent(stage),在这两种情况下从 Groovy 代码编译的字节码看起来都与此类似:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package groovyx.gpars.agent;

import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;

public class Test<T> implements GroovyObject {
    public Test() {
        MetaClass var1 = this.$getStaticMetaClass();
        this.metaClass = var1;
    }

    public WillsAgent<T> agent(T state) {
        WillsAgent safe = new WillsAgent(state);
        return safe;
    }
}
于 2020-01-03T19:41:40.080 回答