Динамическое связывание с универсальным типом

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

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

или что угодно.

Другие вопросы по тегам