3

私は変数を持っています:

Class<Map.Entry<String, Boolean>> clazz;

そして、何もインスタンス化せずにクラスを割り当てたいと思います。しかし、コンパイラは私に書くことを許しません:

Class<Map.Entry<String, Boolean>> clazz = Map.Entry<String, Boolean>.class;

課題はどうすればいいですか?

4

1 に答える 1

2
Class<Map.Entry<String, Boolean>> clazz =
    (Class<Map.Entry<String, Boolean>>)(Class<?>)Map.Entry.class;

ああ、タイプ消去の喜び。

Map.EntryJava コンパイラは、 (raw) 型とMap.Entry<String, Boolean>(パラメータ化された)型を区別します。残念ながら、 を使用して型リテラルに型パラメーターを追加することはできません.class。したがって、キャストする必要があります。ただし、これを直接行うことはできません。を「迂回」する必要がありますClass<?>。正確には、申し訳ありませんが、理由は覚えていません:)。

また、(この場合) キャストが常に成功することがわかっているため、抑制できる「チェックされていない」警告が表示されます。そう:

@SuppressWarnings("unchecked")
Class<Map.Entry<String, Boolean>> clazz =
    (Class<Map.Entry<String, Boolean>>)(Class<?>)Map.Entry.class;

(この代入が発生するメソッドに警告を表示する必要はありません。代入の前​​に直接配置するだけでかまいません。)

楽しみ!:)

于 2012-07-28T12:21:13.623 に答える