|
|
|
|
|
by norswap
2518 days ago
|
|
Good point, it's a bad example because we assume we're just combining covariance which is intuitive. Nevertheless, I have a point because: 1. Things get harder with contravariance.
2. Things get harder when you mix covariance and contravariance. The prototypical covariance class is Producer<T> (with method produce() returning T) while for contravariance that's Consumer<T> (with method consume taking a T as parameter). Assume each class has a superclass (Consumer0<T> and Producer0<T>) and a subclass (Consumer2<T> and Producer2<T>). Assume V extends U extends T. Can you list the subclasses and superclasses of Consumer<Producer<U>>? Personally, I have to think carefully about this for a minute or so, and I've been there before a couple times. This is not an especially complex scenario either. I've seen things get worse in practice. |
|