Я пытаюсь написать общий загрузчик конфигурации, который поддерживает загрузку в любую целевую структуру данных с помощью вспомогательного объекта, предоставленного вызывающим. Помощник используется для развода загрузчика из любых знаний структуры данных, методов для предварительной обработки значений элементов, создания подструктур и добавления/удаления элементов из структур.Общий класс со статическим вложенным классом одного типа
Учитывая класс и объявления переменных:
public class ConfigLoader<T extends Object>
...
private final Class<T> stcClass;
и статический вложенный интерфейс:
static public interface Helper<T>
{
public Object configValue(String qulfld , String loc);
public Object configValue(String qulfld, T val, String loc);
public Object configValue(String qulfld, String val, String loc);
public Object configValue(String qulfld, Boolean val, String loc);
public Object configValue(String qulfld, Number val, String loc);
public T crtObject();
public void addMember(T tgt, String fld, Object val);
public void rmvMember(T tgt, String fld);
}
и базовый конструктор:
private ConfigLoader(JsonParser psr, Helper<T> hlp, DataStruct vld) {
super();
parser =psr;
helper =hlp;
stcClass =helper.crtObject().getClass(); // <== error here
validation =vld;
errors =new ArrayList<Fail>();
}
Я получаю ошибку компиляции в указана линия конструктора:
ConfigLoader.java:79: error: incompatible types
stcClass =helper.crtObject().getClass();
^
required: Class<T>
found: Class<CAP#1>
where T is a type-variable:
T extends Object declared in class ConfigLoader
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object
1 error
Цель состоит в том, чтобы создать одну фиктивную структуру фронта, из которого, чтобы извлечь Class<T>
объект, который затем используется в каком-либо другом коде, чтобы подтвердить тип структуры, а затем, чтобы вызвать метод хелпера посетителя с T
аргумента с помощью helper.configValue(qulnam,stcClass.cast(val),loc.toString())
,
То, что я не могу понять, почему компилятор не может проверить, что возвращение crtObject
метода от помощника гарантированно будет на самом деле T
объект, так как помощник передается в конструктор сам является Helper<T>
.
Единственная альтернатива, которую я вижу, это передать в аргументе конструктора Class<T>
.
Любая помощь будет оценена по достоинству.
* Единственная альтернатива я вижу, это перейти в 'класса' в виде аргумент конструктора. * Да, нет другого способа узнать тип класса из-за стирания типа. Кроме того, использование '' такое же, как ''. –
Что такое 'stcClass'? –
Вероятно, у вас должен быть объект целевого класса в ваш класс-помощник и использовать его для создания экземпляра. Вы можете сделать это, используя статический заводский метод, например: 'public static Helper forClass (класс extends T>) {etc(); } ' –
fge