2013-06-04 2 views
1

Я пытаюсь написать общий загрузчик конфигурации, который поддерживает загрузку в любую целевую структуру данных с помощью вспомогательного объекта, предоставленного вызывающим. Помощник используется для развода загрузчика из любых знаний структуры данных, методов для предварительной обработки значений элементов, создания подструктур и добавления/удаления элементов из структур.Общий класс со статическим вложенным классом одного типа

Учитывая класс и объявления переменных:

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>.

Любая помощь будет оценена по достоинству.

+2

* Единственная альтернатива я вижу, это перейти в 'класса ' в виде аргумент конструктора. * Да, нет другого способа узнать тип класса из-за стирания типа. Кроме того, использование '' такое же, как ''. –

+0

Что такое 'stcClass'? –

+0

Вероятно, у вас должен быть объект целевого класса в ваш класс-помощник и использовать его для создания экземпляра. Вы можете сделать это, используя статический заводский метод, например: 'public static Helper forClass (класс ) {etc(); } ' – fge

ответ

1

Вы можете объявить тип stctype как <? extends T>.

private final Class<? extends T> stcType; 

Это будет гарантировать, что stctype способен обрабатывать T или любой подкласс T.

Для того, чтобы избавиться от ошибок компилятора, теперь вы можете смело бросить helper.crtObject().getClass(); к Class<? extends T> следующим образом:

stcClass = (Class<? extends T>) helper.crtObject().getClass(); 
+0

То, что я решил сделать, это добавить метод к помощнику, чтобы вернуть класс, вместо того, чтобы передавать его. Это казалось чистым и содержало весь код типа. –

Смежные вопросы