これはタイプ セーフであると確信していますが、Eclipse が@SuppressWarnings("unchecked")
注釈を付けるように求めているので確認したかっただけです。
Map<String, IFace> faces;
public <T extends IFace> T getFace(String key)
{
return (T) faces.get(key);
}
これはタイプ セーフであると確信していますが、Eclipse が@SuppressWarnings("unchecked")
注釈を付けるように求めているので確認したかっただけです。
Map<String, IFace> faces;
public <T extends IFace> T getFace(String key)
{
return (T) faces.get(key);
}
タイプセーフではありません。ここでアップキャストしているため、互換性のない派生クラスにキャストすると、ある時点でエラーが発生します。
たとえば、 ifA_Face
とB_Face
both extends IFace
. ある時点で、 a を型安全ではないB_Face
an としてキャストしている可能性があり ます。A_Face
極端な場合を見てください。IFace
が acutallyでObject
あるとしましょう。コードは次のようになります。
static Map<String, Object> myMap = new HashMap<>();
public static void main(String[] args) throws Exception {
myMap.put("ONE", 1);
myMap.put("TWO", "TWO");
myMap.put("THREE", new Date());
final Calendar calendar1 = getThing("ONE");
final Calendar calendar2 = getThing("TWO");
final Calendar calendar3 = getThing("THREE");
}
public static <T> T getThing(String key) {
return (T) myMap.get(key);
}
したがって、あなたは atclass
よりもextends Object
あなたのMap
(so any class
) に入れています。
ただし、呼び出すgetThing
と、目的の型への暗黙的なキャストが行われます。getThing
私がanyも呼び出すことができることは明らかでclass
あり、盲目的にそれにキャストしようとします。
上記の例では、いくつかのものを my に入れ、それらすべてをsMap
として取得しようとしています。Calendar
これを処理する古典的な方法は、「タイプセーフな異種コンテナー」を使用することです。
Map<Class<?>, IFace> faces;
public <T extends IFace> T getFace(Class<T> key) {
return t.cast(faces.get(key));
}
インターフェイスのクラスを文字列ではなくキーとして使用すると、キーとして渡されたクラスを使用して、戻り値を適切な型に安全にキャストできます。