The constructor M< X, Y > expects to get X and a Y , but you are trying to give it IA< X, Y > and IB< X, Y > . Necessary relationships are reversed; X is IA< X, Y > , but not vice versa, and similarly for Y
The following compilations, but apparently not restrictive enough for what you need:
class A<X extends IA<X,Y>, Y extends IB<X,Y>> implements IA<X,Y>{} class B<X extends IA<X,Y>, Y extends IB<X,Y>> implements IB<X,Y>{} interface IA<X extends IA<X,Y>, Y extends IB<X,Y>> {} interface IB<X extends IA<X,Y>, Y extends IB<X,Y>> {} class M<X extends IA<X,Y>, Y extends IB<X,Y>> extends W<X,Y>{ public M(IA<X,Y> x, IB<X,Y> y){}
source share