Java通用不';I don’我不能推断出类型
我在下面编写了一段代码,其中包含一个通用服务抽象类,该类具有服务在其所有实现中所需的大部分公共功能。所有这些消息都需要进行验证,然后传递给相应的实现类,以便对该对象执行任何操作 但是这里的问题是Java编译器抱怨我下面代码中的参数NotificationMessage类型错误 儿童班 有人能告诉我为什么以及如何解决这个问题吗 我的抽象服务类:Java通用不';I don’我不能推断出类型,java,generics,compiler-errors,Java,Generics,Compiler Errors,我在下面编写了一段代码,其中包含一个通用服务抽象类,该类具有服务在其所有实现中所需的大部分公共功能。所有这些消息都需要进行验证,然后传递给相应的实现类,以便对该对象执行任何操作 但是这里的问题是Java编译器抱怨我下面代码中的参数NotificationMessage类型错误 儿童班 有人能告诉我为什么以及如何解决这个问题吗 我的抽象服务类: public abstract class AbstractService<N extends NotificationMessage> im
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) {
}
}
您的方法:
protected void processData(SummaryNotification notification) {
接受一个摘要通知
,因此不能用通知消息
实例调用它
(想象一下,如果允许您这样做,在processData
方法中,您访问NotificationMessage
实例的方法getSummary
,则会发生运行时异常)
因此,要么:
控制器。加载
以返回摘要通知
或processData
接受NotificationMessage
或摘要通知
,请将您的通知消息
转换为摘要通知
(不建议这样做)也要使控制器通用
class Controller<N extends NotificationMessage> {
public N load() { ...
}
类控制器{
公共N加载(){。。。
}
并使用适当的控制器类型
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);
}
}
公共抽象类AbstractService实现ServiceInterface{
控制器;
@凌驾
公共布尔执行(){
N notification=controller.load();//这将返回正确的子类型
processData(通知);//现在通知的类型正确了
}
受保护的抽象无效处理数据(N通知);
}
}
您发布的代码永远不会编译。请向我们展示您正在使用的实际代码,或者至少是一个最小的实际版本,该版本可以重现您在代码中遇到的问题,例如,return已被编写为retrun这是最小的实际代码,可能在将代码放在此处时做了太多更改,但是它和我的代码是一样的,是的,processData(通知)中有一个编译器错误;,这就是我的问题嗨,曼恩,谢谢你调查我的问题。但是,这不是问题。我从混凝土类传递类型,该类接受其参数。所以从具体类调用不是问题,如果我取出具体类,抽象类本身不会编译,因为processData(notification)处的编译错误,它应该调用抽象类method@Ravi否,您正在调用方法processData(SummaryNotification通知)
带有从控制器获得的通知消息。无法保证将出现摘要通知
,这就是编译器抱怨的原因。@Ravi您无法使用通知消息
实例调用processData。阅读Imagine
部分。@daniu,你在这里,这就是为什么我要从具体类传递类型,我希望编译器能够推断出类型。所以我尝试实现的基本思想是将类型传递给抽象类,抽象类使用该类型,该类型始终是NotificationMessage的子类型,并调用processData(N notification)@MạnhQuyế特恩盖伊ễn、 但是抽象方法中没有对getSummary的引用,它只是将其传递给具体类,而具体类知道SummaryNotification的类型,它在公共类SummaryService Extendes AbstractService中定义了SummaryNotification。不幸的是,不能这样做。这是一个旧的遗留代码,我们并不拥有它well@Ravi在这种情况下,您无法确定控制器是否会创建正确的通知消息
,编译器是否有权投诉。
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);
}
}