Java Generic не выводит тип - PullRequest
       17

Java Generic не выводит тип

0 голосов
/ 12 июня 2018

Я написал нижеприведенный код, который имеет общий абстрактный класс службы, который имеет большинство общих функций, которые служба должна выполнять для всей своей реализации.Все эти сообщения должны быть проверены и затем переданы соответствующему классу реализации, чтобы сделать то, что они хотят сделать с этим объектом

Но проблема здесь в том, что компилятор 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 голосов
/ 12 июня 2018

Сделайте контроллер также общим.

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);
    }
}
0 голосов
/ 12 июня 2018

Ваш метод:

protected void processData(SummaryNotification notification) {

принимает SummaryNotification, поэтому вы не можете вызвать его с экземпляром NotificationMessage.

(Представьте, что вам разрешено это делать, вваш processData метод, вы получаете доступ к методу getSummary из NotificationMessage экземпляра, тогда возникнет исключительная ситуация во время выполнения)

Так что либо:

  1. Измените controller.load, чтобы получить SummaryNotification ИЛИ
  2. Сделайте, чтобы ваш processData принял NotificationMessage ИЛИ
  3. Примените ваш NotificationMessage к SummaryNotification, если вы заранее знаете, что ваш контроллер вернет SummaryNotification (этоне рекомендуется)
...