4

我正在编写自己的TableModel实现。因为我需要一些不同的实现来共享一些功能,所以我决定先准备一个抽象类。表的字段表示为:

protected Object[][] lines;

基本上,同一列中的所有元素都应该属于同一类型,但是列类可能因不同的实现而异。我想setValueAt在抽象类中编写一个通用函数,检查val类型是否正确。

@Override
public void setValueAt(Object val, int row, int col) {
    if (val instanceof this.getColumnClass(col))
        lines[col][row] = val;
}

编译器在这里发出错误信号:

Syntax error on token "instanceof", == expected

为什么?

4

2 回答 2

6

的右操作数instanceof必须是ReferenceType(JLS 15.20)。采用

if (this.getColumnClass(col).isInstance(val))
于 2013-05-10T13:42:02.473 回答
2

instanceof您可以考虑在抽象类中使用泛型类型,而不是使用。您可以使用以下内容声明它:

protected abstract class MyTableModel<T> implements TableModel {
    //...
    protected T[][] lines;
    //...
    @Override
    public void setValueAt(Object val, int row, int col) {
        lines[col][row] = (T) val;
    }
}

这样,您可以让 Java 处理强制转换的类型检查。

如果类之间的唯一区别是值的类型,您也可以只编写一个泛型类。

于 2013-05-10T14:08:47.667 回答