Java - проблема с дженериками

1

Как правильно спроектировать это, чтобы он работал:

В классе 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 ?>)
  • 0
    Просто для пояснения, properties.get(PropertyName) - это Property , верно?
  • 1
    Обобщающий комментарий Джейсона С. Может быть полезным еще немного кода, показывающего участвующие классы, в частности, показывающего, где определено E Вы не можете добавить ...Listener<?> Где ожидается ...Listener<E> , но трудно сказать больше, основываясь на текущем коде.
Показать ещё 5 комментариев
Теги:
generics

1 ответ

1
Лучший ответ
public void <T> addPropertyChangedListener(String propertyName, OnPropertyChangedListener<T>   listener) {
    Property<T> property = (Property<T>)properties.get(propertyName);
    property.addPropertyChangedListener(listener);
}

Невозможно избежать предупреждения без предупреждения, если Properties является гетерогенной коллекцией. Как это даже имеет смысл (в системе типа, такой же слабой, как у Java), чтобы статически typecheck то, чей тип может быть известен только во время выполнения?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню