これはタイプ セーフであると確信していますが、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_Faceboth extends IFace. ある時点で、 a を型安全ではないB_Facean としてキャストしている可能性があり ます。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));
}
インターフェイスのクラスを文字列ではなくキーとして使用すると、キーとして渡されたクラスを使用して、戻り値を適切な型に安全にキャストできます。