私は次のクラスを持っています:
public interface ModelObject {
}
public interface Resource {
}
public interface Transformer <F,T>{
}
public interface WrapperFactory {
Transformer<Resource, Wrap<? extends ModelObject>> createMapper();
}
public class Wrap<E extends ModelObject> {
}
public class AbstractBaseTransformer<F,T> implements Transformer<F,T> {
}
public class ConcreteModel implements ModelObject {
}
public class ConcreteTransformer extends AbstractBaseTransformer<Resource, Wrap<ConcreteModel>> {
}
public class ConcreteFactory implements WrapperFactory {
@Override
public Transformer<Resource, Wrap<? extends ModelObject>> createMapper() {
return new ConcreteTransformer();
}
}
ConcreteFactory は、ConcreteTransformer が返されたものと互換性がないことを示すコンパイルを行いません。
Transformer<Resource, Wrap<? extends ModelObject>>
ここで何が問題なのかわかりません。ConcreteTransformer は、1 番目のパラメーターを Resource にバインドし (予想どおり)、2 番目のパラメーターを次のようにバインドします。
Wrap<ConcreteModel>
以下にバインドする必要があります。
Wrap<? extends ModelObject>
ConcreteModel がそれを実装しているためです。