Java通用不';I don’我不能推断出类型

Java通用不';I don’我不能推断出类型,java,generics,compiler-errors,Java,Generics,Compiler Errors,我在下面编写了一段代码,其中包含一个通用服务抽象类,该类具有服务在其所有实现中所需的大部分公共功能。所有这些消息都需要进行验证,然后传递给相应的实现类,以便对该对象执行任何操作 但是这里的问题是Java编译器抱怨我下面代码中的参数NotificationMessage类型错误 儿童班 有人能告诉我为什么以及如何解决这个问题吗 我的抽象服务类: public abstract class AbstractService<N extends NotificationMessage> im

我在下面编写了一段代码,其中包含一个通用服务抽象类,该类具有服务在其所有实现中所需的大部分公共功能。所有这些消息都需要进行验证,然后传递给相应的实现类,以便对该对象执行任何操作

但是这里的问题是Java编译器抱怨我下面代码中的参数NotificationMessage类型错误

儿童班

有人能告诉我为什么以及如何解决这个问题吗

我的抽象服务类:

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);
        }
    }