是否可以使类从泛型类型扩展?
我希望使用implements
或extends
对不同的组件进行子类化,以便为所有子类添加统一的功能。
我想要实现的目标是:
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 {...}
答案 0 :(得分:4)
您已经从编译器得到了很好的答案,因此不可能让类扩展类型参数。类型参数不是类。而不是abstract class MyAbstractComponent<C extends Component> extends C {...}
我只是遗漏了泛型(这里不太有用)或写:
abstract class MyAbstractComponent<C extends Component> extends Component {...}
备注有关覆盖getSelectedRows()
的希望:
这只能在JTable子类中实现,但不能在面板子类中实现。在这种情况下,我建议采用另一种方法:
重新定义您的子类。
类MyTable扩展JTable实现MyAbstractComponent //这里覆盖getSelectedRows() class MyPanel扩展了JPanel实现MyAbstractComponent
如果你的MyAbstractComponent中已经有一些方法实现,那么考虑将这个代码移动到一个由MyTable和MyPanel调用的辅助类中。由于历史原因,泛型在环境(SWING)中并没有真正有用,因为它没有使用这种语言功能。
无论如何,如果您有兴趣了解有关泛型的更多信息,我建议使用Angelika Langers教程和关于泛型的常见问题解答(只需谷歌)。
答案 1 :(得分:0)
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);
}
}