Динамическое связывание с универсальным типом
Мне нужно связать динамический параметрический тип (список), но я не понимаю это правильно... вот обзор моих классов:
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. Я хочу использовать динамическое связывание, чтобы получить правильное окно настроек для каждого объекта, который я хочу добавить туда. поэтому я перегружаю метод getField следующим. для строки это довольно просто:
public SettingsField<String> getField(String x){
return new StringSettingsField();
}
но для карты у меня есть некоторые проблемы...
public SettingsField<Map<? extends String, ?>> getField(Map<? extends String, ?> x){
return new MapSettingsField();
}
то, что ключ всегда является строкой, является экзаменом (может быть?), но теперь компилятор дает мне предупреждение, что
MapSettingsField является необработанным типом. Ссылки на универсальный тип MapSettingsField должны быть параметризованы
но как я могу сделать это здесь? проблема только в том, что использование Map недопустимо из-за некоторой проблемы с f-generic в java (List не является неявным подтипом List, даже если B является подтипом A)
какие-нибудь намеки? заранее спасибо!
1 ответ
ИИУЙК, тебе нужно
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> ...
или что угодно.