динамическое связывание с универсальным типом - PullRequest
0 голосов
/ 02 февраля 2011

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

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 следующим.для String это довольно просто:

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 Ответ

1 голос
/ 02 февраля 2011

IIUYC, вам нужно

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

Кстати, extends String не имеет особого смысла, поскольку 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> ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...