I want to provide something like this in my api:
class Foobar extends AbstractThing<Double>
class EventThing<Foobar> {
public Foobar getSource();
public Double getValue();
}
So I write this:
class EventThing<T extends AbstractThing<U>> {
public T getSource();
public U getValue();
}
But java can not resolve the U.
With EventThing<T extends AbstractThing<U>,U> instead it works, but the second U is actually redundant ’cause the AbtractThing define the Type already. So I love to get rid of it.
You can’t get rid of it. The second
Uis not redundant. You want the compiler to interpret the firstUas a type parameter, but it doesn’t. You could also have written this:Note that
Doublein this case is a concrete class, and not a type parameter. Compare this to the following:Note that this has the exact same form as the first line of code above. How is the compiler supposed to know that in the first case,
Doubleis meant as a concrete class, while in the second case,Uis meant as a type parameter?The compiler can’t know that, and treats the
Uas a concrete class, just like theDoublein the first line. The only way to let the compiler know thatUis a type parameter is to specify it as such: