Java Generic不会推断出类型

时间:2018-06-12 11:28:03

标签: java generics compiler-errors

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

但问题是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 "";              
     }
}

2 个答案:

答案 0 :(得分:0)

你的方法:

protected void processData(SummaryNotification notification) {

接受SummaryNotification,因此您无法使用NotificationMessage实例调用它。

(想象一下,如果您允许这样做,在processData方法中,您访问getSummary实例的方法NotificationMessage,那么将发生运行时异常)

所以:

  1. 将您的controller.load更改为返回SummaryNotification
  2. processData接受NotificationMessage
  3. 如果您事先知道控制器将返回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);
    }
}