2015-03-30 4 views
-2

У меня есть ниже класс Genric который используется для установки любого типа данных Проблемы при использовании общего

 public class NotificationData<E> { 
      private E element; 
      public E getElement() { 
       return element; 
      } 

Ниже интерфейс задачи Notification, который показывает время компиляции ошибки -

T не может быть разрешен к типу. Я добавляю «» перед методом, который разрешает ошибку, но создает проблему для других классов, которые используют этот интерфейс.

public interface NotificationTask { 
      void execute(NotificationData<T> taskData); 
      // --other methods 
} 

Ниже класс реализует его, но показывающий ошибки

Имя столкновения: Метод Execute (NotificationData) типа AbstractEmailNotificationTask имеет тот же стирание как выполнения (NotificationData) типа NotificationTask но делает не переопределить его

и подготовитьEmailTemplate показать людям мычание error-

Метод prepareEmailTemplate (NotificationData) от типа AbstractEmailNotificationTask относится к отсутствующему типу Т

public abstract class AbstractEmailNotificationTask implements NotificationTask{ 
    private static final Log logger = LogFactory.getLog(AbstractEmailNotificationTask.class); 
    private boolean flag; 

    public <T> void execute(NotificationData<?> taskData) { 
     try { 
      String content=prepareEmailTemplate(taskData); 
      setTaskExceuted(true); 
     } catch (Exception e) { 
      logger.debug (e.getMessage(),e); 
      setTaskExceuted(false); 
     } 
    } 
    abstract protected String prepareEmailTemplate(NotificationData<T> taskData) throws TaskExecutionException; 
} 



public class AddressUpdateEmailNotification extends AbstractEmailNotificationTask { 
      public AddressUpdateEmailNotification() { 
      } 

      @Override 
      protected String prepareEmailTemplate(NotificationData<CustomerAddress> taskData) { 
       CustomerAddress customerAddress= taskData.getElement(); 
       return customerAddress.getCity() +":"+customerAddress.getState().getStateName(); 
      } 

     } 

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

+0

Почему это обозначено -1? –

ответ

0

Ваш интерфейс не является общим, поэтому методы внутри него не распознаются с общим типом (и не могут быть разрешены одним). Просто сделайте это общее:

public interface NotificationTask<T> { 
    void execute(NotificationData<T> taskData); 
    // --other methods 
} 
+0

Я пробовал это, и в этом случае я добавлю «Т» во все классы, которые реализуют этот интерфейс, а затем абстрактный класс, а затем конкретный класс. –

+0

Теперь мой конкретный класс просит ввести тип в taskData.getElement(); –

+0

Да, это штука с дженериками. Вы должны внедрять его повсюду, иначе это не является общим. Пожалуйста, укажите пример кода для ошибки, которую вы получаете. –

Смежные вопросы