使用泛型时出问题

时间:2015-03-30 06:32:38

标签: java generics

我有Genric类,它用于设置任何自定义数据类型

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

显示编译时错误的通知任务界面 -

  

T无法解析为某种类型。我在方法前添加了“”它确实解决了错误,但是为使用此接口的其他类创建了问题。

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

下面的类实现了它但显示错误

  

名称冲突:类型的方法execute(NotificationData)   AbstractEmailNotificationTask具有相同的擦除功能   notificationTask类型的execute(NotificationData)但不是   覆盖它

和prepareEmailTemplate显示以下错误 -

  

方法prepareEmailTemplate(NotificationData)来自该类型   AbstractEmailNotificationTask是指缺少的类型T

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的类中,我必须传递其他对象。我想使用泛型但面临这些问题。

1 个答案:

答案 0 :(得分:0)

您的界面不是通用的,因此其中的方法无法使用泛型类型识别(并且无法解析为一个)。简单地说它是通用的:

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