2011-02-02 8 views
0

мне нужно, чтобы связать всю динамику parametic типа (List), но я не получаю это правильно ... вот обзор моих классов:динамическое связывание с общим типом

public abstract interface SettingsField<A> extends Window 

то у меня есть некоторые классы, реализует SettingsField:

public class StringSettingsField implements SettingsField<String> 
public class MapSettingsField<K, V> implements SettingsField<Map<K, V>> 

первым реально просто, но, например, второй немного сложнее ... так что я хочу сделать завод, который возвращает SettingsFileds. Я хочу использовать динамическое связывание, чтобы получить правильный параметр SettingsWindow для каждого объекта, который я хочу разместить там. поэтому я перегружаю метод getField следующим образом. для строки его довольно легко:

public SettingsField<String> getField(String x){ 
    return new StringSettingsField(); 
} 

но карты у меня есть некоторые проблемы ...

public SettingsField<Map<? extends String, ?>> getField(Map<? extends String, ?> x){ 
    return new MapSettingsField(); 
} 

, что ключ всегда строка является exampe , но теперь (может быть также?) компилятор дает мне аргумент, что

MapSettingsField - это необработанный тип. Ссылки на общий тип MapSettingsField следует параметризовать

но как я могу это сделать здесь? проблема в том, что использование карты неверно, из-за некоторой проблемы с f-generic в java (List не является неявным подтипом List, даже если B является подтипом A)

любые подсказки? заранее спасибо!

ответ

1

IIUYC, вам нужно

return new MapSettingsField<? extends String, ?>(); 

Btw., extends String не имеет особого смысла, так как строка является окончательным.

Однако, я бы что-то вроде

public <K, V> SettingsField<Map<K, V>> getField(Map<K, V> x){ 
    return new MapSettingsField<K, V>(); 
} 

Вы могли бы объявить K, как ограниченное, также, например,

public <K extends Number, V extends List> ... 

или что-то еще.

+1

Первый пример дает вам ошибку времени компиляции из-за неправильного количества аргументов для типа MapSettingsField ; его нельзя параметризовать аргументами > –

+0

Я думаю, что ваши второй решения кажутся лучшими, потому что у меня есть статический тип safty! благодаря! – reox

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