我正在编写自己的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
为什么呢?
答案 0 :(得分:6)
instanceof
的右操作数必须是ReferenceType
(JLS 15.20)。使用
if (this.getColumnClass(col).isInstance(val))
答案 1 :(得分: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处理强制转换的类型检查。
如果类之间的唯一区别是值的类型,您也可以只写一个泛型类。