0

我正在尝试创建一个“CRUD 管理器”类,对扩展我创建的抽象超类的对象执行数据库操作。抽象类相当简单:

public abstract class IndexedEntity() {

    protected Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        if(id == null)
        this.id = id;
        else throw new UnsupportedOperationException
        ("The ID cannot be changed once it was set.");
    }

}

现在我有几个扩展这个 IndexedEntity 的类,这些类代表我的业务实体:Car、、、CustomerLease

与其为每个业务实体创建一个 CRUD 管理器,我想我会尝试创建一个支持其通用超类的通用 CRUD 类。

如何创建一个泛型类,该类在构造时采用类型参数,并且该类型参数仅限于某些类型 - 那些从 IndexedEntity 继承的类型?

就像是:

public interface ICrudManager<IndexedEntity> {

    public void add(IndexedEntity e);

    public IndexedEntity get(long id);

    public void update(IndexedEntity e);

    public void delete(IndexedEntity e);

    public List<IndexedEntity> getAll();

}

在Java中可能吗?或者,这个想法有什么问题/是否认为这是一个可以接受的设计选择?

(明天我可能会首先放弃它,因为概括很多行为可能太困难了,但目前我很好奇如何做到这一点。

4

3 回答 3

4

使用有界类型参数

public interface ICrudManager<T extends IndexedEntity> {

    public void add(T e);

    public IndexedEntity get(long id);

    public void update(T e);

    public void delete(T e);

    public List<T> getAll();

}

并且您可以创建对象,例如ICrudManager<Car> carManager = new CrudManagerImpl<Car>();

于 2013-05-07T13:52:42.327 回答
1
 public interface MyInterface<T extends MyClass>
于 2013-05-07T13:53:00.920 回答
1

public <T> interface ICrudManager <T exdents IndexedEntity>如果您尝试插入不匹配的类,您可以更改将导致编译器错误的接口行。

如果您希望您的系统更加动态,您可以使用一个带有初始化程序的抽象类,该初始化程序在执行期间测试类型。

 public abstract <T> class {
      {
         if(!T instanceof IndexedEntity)
            throw new TypeException()
         }
   }
于 2013-05-07T14:22:05.527 回答