我在下面编写了一个代码,其中包含一个通用服务抽象类,该类具有服务需要为其所有实现执行的大部分常用功能。所有这些消息都需要进行验证,然后传递给相应的实现类,以便对该对象执行任何操作
但问题是Java编译器抱怨我的代码中的 NotificationMessage 参数类型错误。
儿童班
有人可以告诉我为什么以及如何解决这个问题?
我的AbstractService类:
public abstract class AbstractService<N extends NotificationMessage> implements ServiceInterface {
@Override
public boolean execute() {
NotificationMessage notification = controller.load(); //this call would return object of sub-type of NotificationMessage
processData(notification); //Compiler complains here that the argument is wrong here
}
protected abstract void processData(N notification);
}
}
具体的服务类之一:
public class SummaryService extends AbstractService<SummaryNotification> {
@Override
protected void processData(SummaryNotification notification) {
}
}
数据对象:
public class NotificationMessage {
public String getName() {
return "";
}
}
public class SummaryNotification extends NotificationMessage {
public String getName() {
return "";
}
public String getSummary() {
return "";
}
}
答案 0 :(得分:0)
你的方法:
protected void processData(SummaryNotification notification) {
接受SummaryNotification
,因此您无法使用NotificationMessage
实例调用它。
(想象一下,如果您允许这样做,在processData
方法中,您访问getSummary
实例的方法NotificationMessage
,那么将发生运行时异常)
所以:
controller.load
更改为返回SummaryNotification
或processData
接受NotificationMessage
或NotificationMessage
(不建议这样做),请将SummaryNotification
投放到SummaryNotification
答案 1 :(得分:0)
使控制器也通用。
class Controller<N extends NotificationMessage> {
public N load() { ...
}
并使用适当的控制器类型。
public abstract class AbstractService<N extends NotificationMessage> implements ServiceInterface {
Controller<N> controller;
@Override
public boolean execute() {
N notification = controller.load(); // this will return the correct subtype
processData(notification); // Now notification is of the correct type
}
protected abstract void processData(N notification);
}
}