Java instanceof运算符和返回Class的方法

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

为什么?

2
getColumnClass 方法长什么样子? - pcalcao
抽象的。重要的是它接受一个 int columnIndex 参数并返回 Class<?> 结果,正如 TableModel 接口所需的那样。 - Sventimir
2个回答

6
instanceof的右操作数必须是一个ReferenceType(JLS 15.20)。请使用正确的类型。
if (this.getColumnClass(col).isInstance(val))

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处理类型检查转换。

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


谢谢。你的建议非常宝贵,但问题是“lines”包含各种类型的数据。例如,第一列是“整数”,下一列是“字符串”等等。在另一个子类中可能有两个“整数”列,而没有任何“字符串”。 - Sventimir
1
啊,那种情况下,我可能会创建一个通用的“Column”类,并将“TableModel”实现为某种类型的“Collection<Column>”的包装器。当然,这是个人口味问题。 - maybeWeCouldStealAVan
听起来很有趣。你觉得将我的“Column”作为“TableColumn”的子类如何?这样,模型类也可以实现“TableColumnModel”接口,避免“TableModel”和“TableColumnModel”之间可能出现的数据冲突。 - Sventimir
我并没有仔细研究过 TableModel -- 我不怎么做 GUI -- 所以我无法确切地说。 - maybeWeCouldStealAVan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接