2

私はまだ混乱している他の型キャストJavaジェネリックの質問を見ました。

私は次のクラス階層を持っていWeightedThing<T>ます。VectorWeightedVectorWeightedVectorWeightedThing<Vector>

最近隣検索を行い、指定されたクエリ ベクトルとその距離に最も近いベクトルのリストを返したいと考えています。このために、searchメソッドを定義しました:

public List<WeightedThing<? extends Vector>> search(Vector, int limit) {...}

私ができることを願って

List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)search(query, 1);

これは機能しません (IntelliJ はエラーとしてマークしませんが、Mac OS X 用の Sun の jdk7u10 でコンパイルすると失敗します)。で同じ関数を呼び出すこともありませんVector。にアップキャストを追加することで強制的にコンパイルできますObjectが、それはひどいようです。

これの目的は、任意のタイプのベクトルを検索して追加できるようにすることですが、WeightedVectors のみを追加したことがわかっている場合は、結果を WeightedVectors にキャストしたいと考えています。

4

2 に答える 2

3

一般に、メソッドの戻り値の型にワイルド char 型を使用することはお勧めできません。メソッドのシグネチャを次のように変更してみてはいかがでしょうか。

public <T extends Vector> List<WeightedThing<T>> search(T vector, int limit) {...}
于 2012-10-28T13:31:03.597 に答える
0

のリストは のリストWeightedThing<? extends Vector>と同じではありませんWeightedThing<WeightedVector>。型キャストするには、ワイルド char 型にany collectionキャストしてから、特定の型にキャストします。

 List<WeightedThing<WeightedVector>> neighbors = (List<WeightedThing<WeightedVector>>)
                                                (List<?>)search(query, 1);
于 2012-10-28T12:18:22.653 に答える