:のJavaジェネリック抽象工場の問題、私はこの仕事にするために苦労しています
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
どれ:ここに私のMapperFactoryで
Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
:
public abstract class MapperFactory<M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> {
public static <M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> MapperFactory<M> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
public abstract TaskMapper<? extends Message, ? extends Message, ? extends TaskForm> getTaskMapper();
public static class MyTaskMapperFactory extends MapperFactory<MyTaskMapper> {
@Override
public TaskMapper<? extends Message, ? extends Message, ? extends TaskForm> getTaskMapper() {
return new MyTaskMapper();
}
}
}
public interface TaskMapper<I extends Message, O extends Message, F extends TaskForm> {
public F fillForm(I msgIn, O msgOut, F taskForm);
public O fillMsgOut(F taskForm);
}
public class MyTaskMapper implements TaskMapper<IncomingMessage, OutgoingMessage, MyTaskForm > {
public MyTaskForm fillForm(IncomingMessage msgIn, OutgoingMessage msgOut,
MyTaskForm taskForm) {
return null;
}
public OutgoingMessage fillMsgOut(MyTaskForm taskForm) {
return null;
}
}
問題は、コンパイル・エラーがあるがどのようにこのエラーを修正するアイデア?
public static <M extends TaskMapper<? extends Message, ? extends Message, ? extends TaskForm>> MapperFactory<M> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
をして:置き換えもちろん
public static MapperFactory<?> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
は動作しますが、それは私が探しています答えではありません。
これは、一般的な抽象的な工場パターンの一般的な問題です。 カスタムメイドアップオブジェクトを使用してソースサンプルを提供する回答も歓迎されます。
'MAPPER'は、Javaの規約に準拠したクラス名ではありません。 –
クラス名は可能な限り小さくしてください(ただし、まだクリアしてください)。そして、 'MAPPER'を' Mapper'に改名しますか?奇妙な/長いクラス名はちょうど質問を混乱させ/混乱させます*と*答え。 – Bohemian
@his MAPPERはクラス名ではありません。 HashMapのTなどの汎用型の名前です –