2016-12-02 2 views
5

я в настоящее времяКарта класса, реализующего интерфейс

class A {...} 
interface B {...} 

То, что я хотел бы иметь некоторый эквивалент

HashMap<String, A implements B> 

т.е., что а String карты к любому экземпляру A, который реализует B , Но этот синтаксис не компилируется. Есть ли способ сопоставить класс, реализующий интерфейс? Следует также отметить, что A не является универсальным, так что я не могу сделать что-то вроде

A<? implements B> 
+0

Вы имеете в виду любые подклассы 'A', которые реализуют' B'? –

+0

Это пахнет запахом кода. Вы уверены, что ваш дизайн иерархии классов правильный? – biziclop

+0

@NicolasFilotto точно – Sherz

ответ

5

Это можно сделать в общем контексте, например, в общем методе:

public <T extends A & B> void method() { 
    Map<String, T> map = new HashMap<>(); 
} 

К сожалению , мы не можем применять эти множественные ограничения к подстановочным знакам.

+0

Это выглядит интересно, но я объявляю эту карту в методе, который уже имеет возвращаемое значение, поэтому я не могу получить эту параметризацию из подписи. Технически я мог бы реорганизовать это в какой-то странный метод getHashMap(), который возвращает только параметризованную карту, основанную на сигнатуре, но это кажется взломанным. – Sherz

+0

@Sherz, тип возврата здесь не имеет значения, метод можно вызвать как 'this. method() 'где' C' является 'классом C extends A реализует B' – Andrew

Смежные вопросы