我在Java中有一个复杂的泛型类型实现,但我无法完成它.我在AddItemEvent
节课上遇到了错误.getHandler
中的返回类型与其父类要求的类型不匹配.
AddItemEventHandler
实际上是BaseEventHandler<BaseEvent<AddItemCommand, AddItemPayload>, AddItemCommand, AddItemPayload>
,但我在这条线上得到了一个错误.
public abstract class BasePayload {
}
public class AddItemPayload extends BasePayload {
private int id;
private String name;
public AddItemPayload(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
public class BaseCommand<T extends BasePayload> {
String command;
T payload;
public BaseCommand(String command, T payload) {
this.command = command;
this.payload = payload;
}
}
public class AddItemCommand extends BaseCommand<AddItemPayload> {
public AddItemCommand(AddItemPayload payload) {
super("AddItem", payload);
}
}
public abstract class BaseEventHandler<E extends BaseEvent<C, P>, C extends BaseCommand<P>, P extends BasePayload> {
abstract public void onTry(E event, ArrayList<BaseEvent<?, ?>> actualEvents);
abstract public void onCommit(String uuid, E event);
}
public class AddItemEventHandler extends BaseEventHandler<AddItemEvent, AddItemCommand, AddItemPayload> {
@Override
public void onTry(AddItemEvent event, ArrayList<BaseEvent<?, ?>> actualEvents) {
}
@Override
public void onCommit(String uuid, AddItemEvent event) {
}
}
public abstract class BaseEvent<C extends BaseCommand<P>, P extends BasePayload> {
abstract protected BaseEventHandler<BaseEvent<C, P>, C, P> getHandler();
}
public class AddItemEvent extends BaseEvent<AddItemCommand, AddItemPayload> {
@Override
protected BaseEventHandler<BaseEvent<AddItemCommand, AddItemPayload>, AddItemCommand, AddItemPayload> getHandler() {
return new AddItemEventHandler(); // I have an error on this line
/*
Incompatible types. Found: 'org.example.handlers.AddItemEventHandler',
required: 'org.example.handlers.BaseEventHandler<org.example.events.BaseEvent<org.example.commands.AddItemCommand,org.example.payload.AddItemPayload>,
org.example.commands.AddItemCommand,org.example.payload.AddItemPayload>'
*/
}
}