10

Effective Java Second Editionのアイテム28から:「リターンタイプとしてワイルドカードタイプを使用しないでください。ユーザーに追加の柔軟性を提供するのではなく、クライアントコードでワイルドカードタイプを使用するように強制します。」

public final Class<? super T> getRawType()

私が書いているコードの一部にある最後のチェックされていないキャスト警告を理解するために、一般的なワイルドカードを理解し始めたところですが、getRawType()がワイルドカードタイプを返す理由がわかりません。

class Base<T>{}
class Child<T> extends Base<T>{}

public <C> void test (TypeToken<? extends Base<C>> token) {
    Class<? extends Base<C>> rawType = (Class<? extends Base<C>>) token.getRawType();
}

token.getRawType()をキャストする必要があります。

Class<? super ? extends Base<C>>
4

2 に答える 2

8

TypeToken<ArrayList<String>>があり、取得したい場合はどうなりますかClass<ArrayList>(それ生の型です)。が返された場合、それはあなたが望んでいないものClass<T>を返します。Class<ArrayList<String>>Class<ArrayList>

于 2012-06-29T18:40:06.290 に答える
0

「トークン」のジェネリック型が Type クラスの場合 (つまり、S が

TypeToken<S>

java.lang.reflect.Type クラス) の場合、TypeToken.getRawType() は S に関連付けられた生の型を返します。これは、S の親である Class オブジェクトになります。

TypeTokenのソース コードを参照してください。

場合によっては (複数の境界がある場合など)、実装された戦略が機能せず、生の型を使用しても問題ありません: 生の型は Object.class になります。

たとえば、MoreTypesを参照してください。

public static Class<?> getRawType(Type type) {
...
} else if (type instanceof TypeVariable) {
  // we could use the variable's bounds, but that'll won't work if there are multiple.
  // having a raw type that's more general than necessary is okay  
  return Object.class;

} else {
...
}
于 2012-06-29T12:57:12.517 に答える