Java - использование Hashtable с интерфейсом в качестве значения - PullRequest
0 голосов
/ 12 марта 2011

У меня один интерфейс IMyInterface. Набор классов, который реализует этот интерфейс: Class1, Class2 ...

Теперь я хочу создать Hashtable, в котором будет храниться любой класс, реализующий IMyInterface.

Hashtable<String,? extends IMyInterface> ht = new Hashtable<String,? extends IMyInterface>();
ht.add("foo",new Class1());

Компилятор жалуется, что он не может вызвать ht и что он не может добавить Class1, потому что метод add не определен для этого. метод add ожидает IMyInterface: \

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Просто используйте:

Hashtable<String, IMyInterface> table = new Hashtable<String, IMyInterface>();
table.put("foo", new Class1());

Учитывая, что Class1 реализует IMyInterface.

0 голосов
/ 12 марта 2011

Тип, который вы написали, Hashtable<String,? extends IMyInterface> означает Hashtable, который хранит в качестве значений элементы некоторого подтипа IMyInterface, но мы не знаем, какой из них .Это приемлемо для типа переменной (и тогда вы не можете добавить к нему какие-либо ключи, так как компилятор не может быть уверен, что вы используете правильный подтип), но это не пригодно для вызова конструктора.

То, что вы хотите - это Hashtable<String, IMyInterface>, что означает любой объект, реализующий IMyInterface , может быть значением.

Кстати, лучше использовать Map<String, IMyInterface> для переменной и HashMap<String, IMyInterface>для конструктора вместо Hashtable.

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