Как правильно спроектировать это, чтобы он работал:
В классе Property<E>
:
public void addPropertyChangedListener(OnPropertyChangedListener<E> listener) {
listeners.add(listener);
}
В классе ViewModelBase
:
public void addPropertyChangedListener(String propertyName, OnPropertyChangedListener<?> listener) {
Property<?> property = properties.get(propertyName);
property.addPropertyChangedListener(listener); // I get error here
}
Ошибка:
The method addPropertyChangedListener(Property.OnPropertyChangedListener<capture#5-of ?>)
in the type Property<capture#5-of ?> is not applicable for the arguments
(Property.OnPropertyChangedListener<capture#6-of ?>)
public void <T> addPropertyChangedListener(String propertyName, OnPropertyChangedListener<T> listener) {
Property<T> property = (Property<T>)properties.get(propertyName);
property.addPropertyChangedListener(listener);
}
Невозможно избежать предупреждения без предупреждения, если Properties
является гетерогенной коллекцией. Как это даже имеет смысл (в системе типа, такой же слабой, как у Java), чтобы статически typecheck то, чей тип может быть известен только во время выполнения?
properties.get(PropertyName)
- этоProperty
, верно?E
Вы не можете добавить...Listener<?>
Где ожидается...Listener<E>
, но трудно сказать больше, основываясь на текущем коде.