创建一个泛型类,其类型参数仅限于某个超类

时间:2013-05-07 13:50:38

标签: java generics types

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

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的类,这些类代表我的业务实体:CarCustomerLease

我没有为每个业务实体创建一个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中有可能吗?或者,这个想法有什么不对/认为这是一个可以接受的设计选择吗?

(明天我可能会先放弃它,因为要概括很多行为可能太难了,但此刻我很好奇它是如何做到的。

3 个答案:

答案 0 :(得分:4)

使用Bounded Type Parameters

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>();

等对象

答案 1 :(得分:1)

 public interface MyInterface<T extends MyClass>

答案 2 :(得分:1)

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

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

 public abstract <T> class {
      {
         if(!T instanceof IndexedEntity)
            throw new TypeException()
         }
   }