Конструктор не может быть применен к ошибке '(T)' при использовании @CompileStatic и универсального класса

Я пытаюсь "исправить" другой код, который я обновлял.

Я свел это к простому примеру универсального класса, а затем к использованию этого класса.

Сначала я объявил общий параметризованный класс следующим образом

//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 показывает красную волнистую линию под (состоянием), передавая параметр в конструктор, как это

Если закомментировать объявление @CompileStatic - ошибка исчезнет

Если я наведу курсор на волнистую линию (с включенным @CompileStatic), она покажет следующее: Constructor 'WillsAgent' in 'groovyx.gpars.agent.WillsAgent<T>' cannot be applied to '(T)'

Я не могу понять, как это исправить, кроме удаления @CompileStatic

Есть ли у кого-нибудь идеи, почему он на это жалуется и что делать, чтобы это исправить?

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;
    }
}
Другие вопросы по тегам