2013-05-10 2 views
4

TableModel 구현을 작성하고 있습니다. 일부 기능을 공유하는 몇 가지 다양한 구현이 필요할 것이므로 먼저 추상 클래스를 준비하기로했습니다. 그러나 열 클래스가 다른 구현 예에 따라 다를 수 있으며, 기본적으로 같은 열에있는 모든 요소를 ​​동일한 유형이어야java instanceof 연산자 및 클래스 반환 메서드

protected Object[][] lines; 

: 테이블의 필드에 의해 표현된다. val이 적절한 유형인지 아닌지를 확인하기 위해 공통 클래스에 공통적 인 setValueAt 함수를 작성하고 싶습니다. 여기

@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

+0

요약. 중요한 것은'int columnIndex' 인자를 얻고'TableModel' 인터페이스가 요구하는대로'Class '결과를 반환한다는 것입니다. – Sventimir

답변

6

instanceof의 오른쪽 피연산자는 ReferenceType(JLS 15.20)이어야합니다. 오히려 instanceof를 사용하는 것보다

if (this.getColumnClass(col).isInstance(val)) 
+0

고맙습니다. :) – Sventimir

2

를 사용하여, 당신은 당신의 추상 클래스에서 제네릭 형식을 사용하는 것이 좋습니다. 다음과 같이 선언 할 수 있습니다.

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에서 캐스트에 대한 유형 검사를 처리 할 수 ​​있습니다.

클래스 간의 유일한 차이점이 값의 유형 인 경우 하나의 제네릭 클래스를 작성할 수도 있습니다.

+0

고맙습니다. 당신의 충고는 귀중하지만, 요점은'lines'은 다양한 타입의 데이터로 구성된다는 것입니다. 예를 들어, 컬럼 1은'Integer'이고, 그 다음은'String'입니다. 또 다른 하위 클래스에는 두 개의 'Integer' 열과'String '열이 전혀 없을 수 있습니다. – Sventimir

+1

아. 이 경우, 일반적인'Column' 클래스를 생성하고'Collection '을 감싸는 래퍼로'TableModel'을 구현할 것입니다. 물론 이것은 맛의 문제입니다. – maybeWeCouldStealAVan

+0

재미있는 소리. 그리고 내'Column'을'TableColumn'의 하위 클래스로 만드는 것에 대해 어떻게 생각합니까? 모델 클래스는'TableColumnModel' 인터페이스도 구현할 수 있으며,'TableModel'과'TableColumnModel' 사이의 가능한 모든 데이터 충돌을 막을 수 있습니다. – Sventimir