【问题标题】:Concrete implementation of method being ignored by subclass?子类忽略方法的具体实现?
【发布时间】:2016-11-30 18:41:50
【问题描述】:

我有一个 InboundMessageDao 类,它扩展了 BaseDao 类,它实现了 BaseDaoInterface 类。

BaseDao 类是抽象的,提供具体和抽象的成员方法。 出于某种原因,Eclipse 声称我没有从 BaseDaoInterface 实现持久化、更新和删除,尽管 BaseDao 中提供了它们的具体实现。

奇怪的是,我还有另一个子类,UserDao,它做同样的事情,但未实现的方法没有错误。

BaseDao.java

package com.MYPKG.data.dao;

import java.text.MessageFormat;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.core.GenericTypeResolver;

import com.MYPKG.model.User;

public abstract class BaseDao <T> implements BaseDaoInterface<T, String> {
    private Session currentSession;
    private Transaction currentTransaction;

    public BaseDao() {
    }

    public Session openCurrentSession() {
        currentSession = HibernateUtil.getSession();
        return currentSession;
    }

    public Session openCurrentSessionwithTransaction() {
        currentSession = HibernateUtil.getSession();
        currentTransaction = currentSession.beginTransaction();
        return currentSession;
    }

    public void closeCurrentSession() {
        currentSession.close();
    }

    public void closeCurrentSessionwithTransaction() {
        currentTransaction.commit();
        currentSession.close();
    }
    public Session getCurrentSession() {
        return currentSession;
    }

    public void setCurrentSession(Session currentSession) {
        this.currentSession = currentSession;

    }

    public Transaction getCurrentTransaction() {
        return currentTransaction;
    }

    public void setCurrentTransaction(Transaction currentTransaction) {
        this.currentTransaction = currentTransaction;
    }


    public void persist(User entity) {
         getCurrentSession().save(entity);
    }

    public void update(User entity) {
        getCurrentSession().update(entity);
    }

    public abstract T findById(String id) ;

    public void delete(User entity) {
        getCurrentSession().delete(entity);
    }

    public abstract List<T> findAll() ;

    public void deleteAll() {
        List<T> objects = findAll();
        for (T object : objects)
            getCurrentSession().delete(object);
    }
}

BaseDaoInterface.java

package com.MYPKG.data.dao;

import java.io.Serializable;
import java.util.List;

public interface BaseDaoInterface <T, Id extends Serializable>{

    public void persist(T entity);

    public void update(T entity);

    public T findById(Id id);

    public void delete(T entity);

    public List<T> findAll();

    public void deleteAll();

}

InboundMessageDao.java

package com.MYPKG.data.dao;

import java.text.MessageFormat;
import java.util.List;

import com.MYPKG.model.InboundMessage;
import com.MYPKG.model.User;

public class InboundMessageDao extends BaseDao<InboundMessage>{

  ///// PROBLEM
  ///// The type InboundMessageDao must implement the inherited abstract method BaseDaoInterface<InboundMessage,String>.update(InboundMessage)
  /////

    public InboundMessageDao() {

    }

    @Override
    public InboundMessage findById(String id) {
        InboundMessage object = (InboundMessage) getCurrentSession().get(InboundMessage.class, id);
        return object;
    }

    @Override
    public List<InboundMessage> findAll() {
        @SuppressWarnings("unchecked")
        List<InboundMessage> objects = (List<InboundMessage>) getCurrentSession().createQuery(MessageFormat.format("from {0}",  "inbound_message")).list();
        return objects;
    }

}

UserDao.java

package com.MYPKG.data.dao;

import java.text.MessageFormat;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.MYPKG.model.User;

public class UserDao extends BaseDao<User>{;

    public UserDao() {
    }

    public List<User> findAll() {
        @SuppressWarnings("unchecked")
        List<User> objects = (List<User>)getCurrentSession().createQuery(MessageFormat.format("from {0}",  "user")).list();
        return objects;
    }

    public User findById(String id) {
        User object = (User) getCurrentSession().get(User.class, id);
        return object;
    }


}

【问题讨论】:

  • 什么是InboundMessage
  • @PritamBanerjee : 代表实体的 POJO
  • @jonhopkins :哇,我不敢相信我用 User 类而不是泛型类型标记了它们。你能把它作为答案发布吗?
  • 哈哈我实际上是把它写成答案,但觉得它看起来太短了..

标签: java interface abstract-class


【解决方案1】:

由于您的BaseDao 类是使用通用&lt;T&gt; 定义的,因此您应该使用T 而不是User 来定义您的覆盖方法。如果你给这些方法加上@Override注解,你会发现它们实际上并没有覆盖接口的方法,而是它们自己的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2016-08-13
    • 2023-03-13
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多