Tôi đang đấu tranh để làm cho công việc này:Java Generics vấn đề nhà máy trừu tượng
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;
}
}
Vấn đề là một lỗi biên dịch:
Type mismatch: cannot convert from MapperFactory.MyTaskMapperFactory to MapperFactory
trong MapperFactory tôi ở đây:
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
Bất kỳ ý tưởng làm thế nào để sửa lỗi này?
Dĩ nhiên thay thế:
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!");
}
với:
public static MapperFactory<?> getMapperFactory(Message msgIn, Message msgOut) {
if (msgIn.isMyMapper())
return new MyTaskMapperFactory();
throw new IllegalStateException("Mapper not found!");
}
sẽ làm việc, nhưng đó không phải là câu trả lời mà tôi đang tìm kiếm.
Điều này có vẻ là một vấn đề với mô hình nhà máy chung trừu tượng nói chung. Câu trả lời cung cấp các mẫu nguồn bằng cách sử dụng các đối tượng được tạo tùy chỉnh cũng được hoan nghênh.
'MAPPER' không phải là tên lớp tốt theo quy ước Java. –
Hãy đặt tên lớp của bạn càng nhỏ càng tốt (nhưng vẫn rõ ràng). Và đổi tên 'MAPPER' thành' Mapper'? Các tên lớp lạ/dài chỉ gây nhầm lẫn/làm lộn xộn câu hỏi * và * câu trả lời. – Bohemian
@his MAPPER không phải là tên lớp. Đó là tên của loại chung chung như T trong HashMap –