2016-10-24 15 views
11

私はTreeTableで働いていると、セルファクトリーを変更するとき、私は、Aは、私はクラス働いているが、私はの「キャプチャーの操作方法が分からないJavaジェネリックの "キャプチャ?"

Callback<TreeTableColumn<A, capture of ?>, TreeTableCell<A, capture of ?>> 

に合格するために必要なのですか? " "?"

は私が

new Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>> 

を作成しようとしましたが、IDEAの代わりに、私は(文字列のような)特定のクラスを使用してみました

setCellFactory(Callback<TreeTableColumn<A, capture<?>>, TreeTableCell<A, capture<?>>>) in TreeTableColumn cannot be applied to (anonymous Callback<TreeTableColumn<A, ?>, TreeTableCell<A, ?>>) 

警告を示しますしかし、何も助けなかった。

誰も私にこの方法を教えてもらえますか?

ありがとうございます。

EDIT:

私は少しより多くの情報を集め... TreeTableColumn<S,T>CellFactoryCallback<TreeTableColumn<S,T>TreeTableCell<S,T>>でなければなりません、しかし、私が働いているTreeTableColumnは、(ライブラリ内の)生タイプとして作成されます。

生のタイプのコールバックを使用します。しかし、これをどうやって動作させるか他の選択肢はありますか?

+0

''コンパイラはタイプが何であるかを知らないことを意味します。タイプが何であるのか分からないとき、それは別の未知の時間と一致できません。それは何かを受け入れるワイルドカードのようではありません。 –

+1

'私は特定のクラス(Stringのような)を"? "の代わりに使用しようとしました。何も助けてくれませんでした」 - あなたは何を試してみたのかを示し、匿名のインスタンス、つまりコードをどのように定義したのかを示すことができます。 – Thomas

+0

正確なコードである 'setCellFactory(新しいコールバック、TreeTableCell >(){ @Override 公共TreeTableCell コール(TreeTableColumn PARAM){ 戻りNULL; } });'または "?"の代わりに "String" – kotycheese

答えて

8

ワイルドカードは不明なタイプを表します。

ワイルドカードキャプチャは、ワイルドカードタイプの値を新しいタイプ変数にバインドするプロセスです。たとえば:

List<?> list = ...; 
shuffle(list); 
ここ

<T> void shuffle(List<T> list) { 
    ... 
} 

は、?の未知の値をシャッフル方法は、その型を参照することができ、shuffleメソッドの呼び出し時に新しい型変数Tにバインドされています。

Javaコンパイラは、内部的にワイルドカードの値を「奪取」と呼ばれる匿名型変数でキャプチャして表現します。 (実際には、?のさまざまな使用が異なるタイプを参照する可能性があり、したがって異なるキャプチャを持つため、javacは「#の1をキャプチャしますか?」と呼びます)。

あなたのコードで何が間違っていますか?あなたは、呼び出し側によって提供されなければならないメソッドシグネチャ、Tはシングルタイプの略typeパラメータでは、

Callback<TreeTableColumn<S,?>, TreeTableCell<S, ?>> factory; 

<S,T> setCellFactory(Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> factory); 

メソッドを呼び出そうとしています。便宜上、コンパイラは自動的に適切な値を推論しようとします( - >型推論)。あなたのコンパイルエラーは、コンパイラがこれを行うことができなかったことを意味します。

この場合

Tに適切な値を割り当てることが事実上不可能であるように、両方の?Tのサブタイプである必要があるため、これは、型推論の欠点ではなく、コンパイラが知ることができない、二つ?同じ種類、または関連する種類を表します。

このメソッドを正常に呼び出すには、引数の型がTのすべての型に対して同じ型を使用する必要があります。すでにこのような型がある場合は、先に進んで使用してください。それ以外の場合は、ワイルドカードのキャプチャを使用して1を導入することができる場合があります?

setCellFactory(newFactory()); 

どこ

<S,T> Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> newFactory() { 
    return new Callback<TreeTableColumn<S,T>, TreeTableCell<S,T>> { 
     ... 
    } 
} 
+0

ありがとう、ジェネリックメソッドは、私が探していたソリューションです! – kotycheese

2

私はあなたがコンパイラが必要なヘルパークラスを見つけるか、そこにオブジェクトを配置しようとすることはできませんいくつかの問題に直面している、しかし、あなたは彼を与えることはできませんように見える what is a capture conversionoracle capture generic docs から見つけたものから安全に変換されました。

EDIT:何cellFactoryがTreeTableColumnインスタンスに指定されていない場合

DEFAULT_CELL_FACTORY

public static final Callback<TreeTableColumn<?,?>,TreeTableCell<?,?>>

、その後、 これはデフォルトで使用されます。現在、アイテムが ノードの場合は、 TableCellアイテムプロパティをグラフィックプロパティ内にレンダリングします。ヌルでない場合は、単純にtoString()を呼び出し、 という結果の文字列をtextプロパティ内に設定します。

プロパティcellFactoryの値を設定し

setCellFactory

public final void setCellFactory(Callback<TreeTableColumn<S,T>,TreeTableCell<S,T>> value)

。 プロパティの説明: この列のすべてのセルのセルファクトリ。セルファクトリは、単一のTreeTableColumnの各TreeTableCellに含まれるデータのレンダリングを行います。 デフォルトでは、TreeTableColumnはデフォルトのセルファクトリを使用しますが、これはカスタム実装に置き換えることができます。たとえば、別の方法でデータを表示したり、編集をサポートすることができます。他の場所でカスタムセルファクトリを作成する方法については、多くのドキュメントがあります(たとえば、CellとTreeTableViewを参照してください)。

最後に、javafx.scene.control.cellパッケージには、多数の事前構築されたセルファクトリが用意されています。

Java 8 API Docから取り出された。

ので、このようなものが右方向にもっと行くべきである:あなたがセルに与えたいexcactlyものに応じて

public static <S> Callback<TableColumn<S,String>, TableCell<S,String>> forTableColumn() { 
    return forTableColumn(new DefaultStringConverter()); 
} 

またはこのような何か。

setCellFactory(TextFieldTableCell.<DataModel, Integer>forTableColumn(new IntegerStringConverter())); 

これらのコードスニペットは、This StackOverflow Thread

から取られ、あまりにもあなたを助けることができるこのリンクを長持ちさ: TableView Cell Tutorial

だから、これは何を引き起こしている可能性がありますについて暗闇の中であなたにいくつかのより多くの光を与える必要があります問題。

+0

私は何ができるか考えていますか?それを動作させるには? – kotycheese

+0

あなたの問題を解決するために私の答えが更新されました。私はJavaFXやTreeTableViewを使用していないので、私はちょうど研究を読んで、ドキュメントを読むことによって助けることができます:)これはあなたが@kotycheeseを助けることを願って – Nico

+0

ありがとう、あなたは私をたくさん助けました。私は自分の質問を更新し、さらに情報を追加しました。問題を理解するのに役立ちますか? – kotycheese