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

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

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 должны быть параметризованы.

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

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


person reox    schedule 02.02.2011    source источник


Ответы (1)


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

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

person maaartinus    schedule 02.02.2011
comment
Первый пример дает вам ошибку времени компиляции из-за неправильного количества аргументов для типа MapSettingsField‹K,V›; его нельзя параметризовать аргументами ‹Map‹? расширяет строку?›› - person michal.kreuzman; 02.02.2011
comment
я думаю, что ваши вторые решения кажутся лучшими, потому что у меня статический тип safty! Благодарность! - person reox; 04.02.2011