Конструктор не может быть применен к ошибке '(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;
}
}