Я проектирование класса контейнера, который предназначен для хранения пары реализацийGeneric производителя и потребитель
public interface MetaData<ValueType>{
public String getName();
}
и соответствующего значения параметра ValueType
типа. Так что я написал это (принудительную реализацию некоторых инвариантов опущен):
public final class ParametersImpl implements Parameters{
private final Map<MetaData<?>, Object> parameters;
{
parameters = new HashMap<>();
}
@Override
public Object getValue(MetaData<?> pmd) {
return parameters.get(pmd);
}
@Override
public <M> void put(MetaData<M> p, M value) {
parameters.put(p, value);
}
}
где
public interface Parameters {
public Object getValue(MetaData<?> pmd);
public <M> void put(MetaData<M> p, M value);
}
Дело в том, когда клиент вызывает метод Object getValue(MetaData<?> pmd)
они должны делать явное приведение:
MetaData<List<Integer>> metaData;
Paramters params;
List<Integer> list= new ArrayList<>();
//intialization
params.put(metaData, list);
//do some other
List<Integer> lst = (List<Integer>) params.getValue(metaData);
Хотя бросок полностью безопасен, я хотел бы избежать его и предоставить какой-то общий метод. Но когда я пытаюсь это заявление:
public <M> M getValue(MetaData<M> pmd);
я получил компиляции ошибки в реализации:
public <M> M getValue(MetaData<M> pmd) {
return parameters.get(pmd); //cannot convert capture-of-#1 to M
}
ВОПРОС: Есть ли способ generify метод public Object getValue(MetaData<?> pmd);
каким-либо образом?
Ваш HashMap объявляется иметь значение типа 'Object'. Предположительно, это должен быть какой-то общий тип ...? – khelwood
Не могли бы вы сделать бросок внутри 'getValue'? –
Просто нажмите: 'return (M) parameters.get (pmd)' и аннотируйте метод с помощью '@SuppressWarnings (« unchecked »)' – Raffaele