Я пытаюсь сделать несколько сильных типизированные API:Метод Обобщение связаны ограничения с классом Дженерик
class PropertyType<T> { ... }
class SubType1<T> extends PropertyType<T> { ... }
class SubType2<T> extends PropertyType<T> { ... }
class PropertyHandler<K extends PropertyType<?>> {
// Here, the V generics is not related to the property type,
// hence the value is not typed
public <V> getValue(K prop) { ... }
// In this case, we have correct typing, but T is not bounded to K
public <V, T extends PropertyType<V>> getValue(T prop) { ... }
// This would be a solution, but it doesn't compile because K is a type variable
public <V, T extends K & PropertyType<V>> getValue(T prop) { ... }
}
И это, как он будет использоваться:
PropertyHandler<SubType1<?>> ph = new PropertyHandler<>();
// I want to allow this
SubType1<Integer> p1 = new SubType1<>();
SubType1<Boolean> p2 = new SubType1<>();
Integer v1 = ph.getValue(p1);
Boolean v2 = ph.getValue(p2);
// I don't want to allow this
SubType2<Integer> p3 = new SubType2<>();
Boolean v3 = ph.getValue(p3);
Есть ли способ решить это ? Может быть, это проблема с архитектурой, которую можно обрабатывать по-разному?
Я не уверен, что понял вопрос правильно, но вы не могли бы изменить «класс PropertyHandler> "to" class PropertyHandler > ", а затем использовать" public "? Кажется, вы ищете способ ограничить значение K только тем, что установлено в > обработчика свойств. –
Erik
Да, это именно так. Однако ваше предложение не работает: «class PropertyHandler>« это не скомпилируется, пока вы также не укажете переменную типа X, которая не является тем, что я хочу ... –
ctabin
Почему вы не хотите создавать X переменная типа? – Erik