zduny
zduny

Reputation: 2541

Java - issue with generics

How do I properly design this, so it would work:

In class Property<E>:

public void addPropertyChangedListener(OnPropertyChangedListener<E> listener) {
    listeners.add(listener);
}

In class ViewModelBase:

public void addPropertyChangedListener(String propertyName, OnPropertyChangedListener<?>   listener) {
    Property<?> property = properties.get(propertyName);
    property.addPropertyChangedListener(listener); // I get error here
}

Error I get:

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 ?>)

Upvotes: 1

Views: 101

Answers (1)

Judge Mental
Judge Mental

Reputation: 5239

public void <T> addPropertyChangedListener(String propertyName, OnPropertyChangedListener<T>   listener) {
    Property<T> property = (Property<T>)properties.get(propertyName);
    property.addPropertyChangedListener(listener);
}

There is no way to avoid an unchecked cast warning if Properties is a heterogeneous collection. How does it even make sense (in a type system as weak as that of Java) to statically typecheck something whose type can only be known at runtime?

Upvotes: 1

Related Questions