2017-12-07 12 views
0

TableColumnから別のものにCellFactoryをコピーしようとしています。実行している問題はジェネリックである。2つのオブジェクトで同じ汎用ワイルドカードを使用する

問題table.getColumns()TableColumn<X, ?>のリストを返し、私は同じTablecolumn<X, ?>パラメータで、新しい列を作成したいが、私は二、?パラメータを知るために方法がないということで。

for (TableColumn<X, ?> col : table.getColumns()) { 
    TableColumn<X, ?> newCol = new TableColumn<>(); 
    newCol.setCellValueFactory(col.getCellValueFactory()); // Error <X, ?> != <X, ?> 
} 

両方のインスタンスで使用される汎用タイプを定義できますか?または、実行時に一般情報が失われるため、これは不可能ですか?

編集:TableColumn<X, Object>にキャスト

が動作しているようですが、これは非常に間違って感じていると私はむしろObjectにキャストに依存しないでしょう。

for (TableColumn<X, ?> col : table.getColumns()) { 
    TableColumn<X, Object> tempCol = (TableColumn<X, Object>) col; 
    TableColumn<X, Object> newCol = new TableColumn<>(); 
    newCol.setCellValueFactory(tempCol.getCellValueFactory()); 
} 

答えて

1

Javaワイルドカードは、不明なタイプの略です。これは、2つの未知の型が同じ型であることができないことを意味する。同じ未知の型を扱っていることをコンパイラに伝えるために、2つのTableColumnを同じ型にバインドする一時的な汎用型Yを定義する必要があります。我々はこれを行うことができます唯一の方法は、このような個別のパラメータ化法に新しいTableColumnのの作成や更新を移動することです:

for (TableColumn<X, ?> col : getColumns()) { 
     TableColumn<X, ?> newCol = create(col); 
} 

public <Y> TableColumn<X, ?> create(TableColumn<X, Y> tc){ 
    TableColumn<X, Y> newCol = new TableColumn<>(); 
    newCol.setCellValueFactory(tc.getCellValueFactory());   
    return newCol; 
} 
+0

私は、これはそれを行うための唯一の方法かもしれない考え出したが、別を必要としないように期待していましたメソッド..ありがとう! – Chris

+0

他の方法で特定のキャプチャを導入できないため、@Chris - 別の方法が唯一の方法です。 – BeeOnRope

関連する問題