从泛型类型参数(类型变量)扩展的类?

时间:2014-01-02 14:43:53

标签: java generics abstract-class

是否可以使类从泛型类型扩展?

我希望使用implementsextends对不同的组件进行子类化,以便为所有子类添加统一的功能。

我想要实现的目标是:

class MyTable extends MyAbstractComponent<JTable> {...}
class MyPanel extends MyAbstractComponent<JPanel> {...}


    MyAbstractComponent t = new MyTable();
    MyAbstractComponent p = new MyPanel();
    container.add(t);
    container.add(p);

在这种情况下,我将如何制定MyAbstractComponent
我尝试了以下内容,但它给出了错误“找到类型:参数C.预期:类”:

abstract class MyAbstractComponent<C extends Component> extends C {...}

2 个答案:

答案 0 :(得分:4)

您已经从编译器得到了很好的答案,因此不可能让类扩展类型参数。类型参数不是类。而不是abstract class MyAbstractComponent<C extends Component> extends C {...}我只是遗漏了泛型(这里不太有用)或写:

abstract class MyAbstractComponent<C extends Component> extends Component {...}

备注有关覆盖getSelectedRows()的希望:

这只能在JTable子类中实现,但不能在面板子类中实现。在这种情况下,我建议采用另一种方法:

  1. 将MyAbstractComponent定义为接口。
  2. 重新定义您的子类。

    类MyTable扩展JTable实现MyAbstractComponent //这里覆盖getSelectedRows() class MyPanel扩展了JPanel实现MyAbstractComponent

  3. 如果你的MyAbstractComponent中已经有一些方法实现,那么考虑将这个代码移动到一个由MyTable和MyPanel调用的辅助类中。由于历史原因,泛型在环境(SWING)中并没有真正有用,因为它没有使用这种语言功能。

    无论如何,如果您有兴趣了解有关泛型的更多信息,我建议使用Angelika Langers教程和关于泛型的常见问题解答(只需谷歌)。

答案 1 :(得分:0)

我做了......类似于我的DAO图层

public interface EntityDAO<E, I> {
    public boolean update(final E entity, Connection connection);
    public E getByID(I id, Connection connection);
    public boolean delete(final I identifier, Connection connection);
}

public abstract class AbstractEntityDAO<E extends Entity, I extends Number> implements EntityDAO<E, I> {

    @Override
    public boolean update(E entity, Connection connection) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public E getByID(I id, Connection connection) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean delete(I identifier, Connection connection) {
        // TODO Auto-generated method stub
        return false;
    }
}

最后,具体的子类将定义实体对象的类型。

public class AddressEntityDAO extends AbstractEntity<Address, Integer> {

    @Override
    public boolean update(Address entity, Connection connection) {
        return super.update(entity, connection);
    }

    @Override
    public Address getByID(Integer id, Connection connection) {
        return super.getByID(id, connection);
    }

    @Override
    public boolean delete(Integer identifier, Connection connection) {
        return super.delete(identifier, connection);
    }
}