3

Java では、次の情報があるとします: 、およびオブジェクトList.class, Map.class, Integer.classのインスタンス。fooにキャストfooすることは可能List<Map<Integer, Integer>>ですか? 型消去によるものではないと思いますが、同様のことを達成する別の方法があるかどうか疑問に思っています。

編集:より多くのコンテキストを提供するため。クエリ (オブジェクトとメトリックで構成される) を受け取り、目的のメトリックを出力できるアプリケーションを作成しています。例としては、「リスト内の要素の合計」があります。クライアントは、自身をアプリに登録し、オブジェクト タイプ (リストの合計など) に特定のメトリック タイプを提供できることをブロードキャストするプロバイダーを作成する必要があります。calculateアプリは、クエリを受信すると、正しいプロバイダーを照合し、そのメソッドを呼び出します。

ジェネリックがなければ、これは簡単です。オブジェクトのインスタンスの正規型は、そのクラスです。したがって、クエリ内のオブジェクトを として扱い、Objectその を使用してclass、オブジェクトのこのインスタンスを提供できるプロバイダーを見つけます。メトリックについても同様です。

fジェネリックを紹介します...要素が である場合はリスト内の要素の合計であり、要素がIntegerである場合は製品であるとメトリックを定義するとしますDouble。を提供するプロバイダーと を提供するプロバイダーの 2 つが必要List<Integer>ですList<Double>。しかし、型消去のため、正規型classを直接使用することはできません。List.classそのため、関連するクラス ( andInteger.classまたはList.classand )を格納し、Double.classクラスのタプルを使用してプロバイダーを照合します。

したがって、メソッドでは、プロバイダーが処理する適切な型へのcalculate共変キャストを実行する必要があります。Object

おそらく私は問題に対して間違ったアプローチを取っていますか?

4

2 に答える 2

2

あなたが得る最も近いものはこれです:

List<Map<Integer, Integer>> fooList = List.class.cast(foo);

安全でないキャストと生の型の使用のためにコンパイラ警告が生成されますが、実際には安全です (オブジェクトが何をするかを含んでいることがわかっている場合)。

于 2012-11-15T17:20:10.960 に答える
2

警告を受けていないわけではありません。

List<Map<Integer, Integer>> bar = (List<Map<Integer, Integer>>) foo;
于 2012-11-15T17:24:22.947 に答える