6

これはタイプ セーフであると確信していますが、Eclipse が@SuppressWarnings("unchecked")注釈を付けるように求めているので確認したかっただけです。

Map<String, IFace> faces;

public <T extends IFace> T getFace(String key)
{
    return (T) faces.get(key);
}
4

3 に答える 3

4

タイプセーフではありません。ここでアップキャストしているため、互換性のない派生クラスにキャストすると、ある時点でエラーが発生します。

たとえば、 ifA_FaceB_Faceboth extends IFace. ある時点で、 a を型安全ではないB_Facean としてキャストしている可能性があり ます。A_Face

于 2013-08-11T13:12:50.650 に答える
0

極端な場合を見てください。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

于 2013-08-11T13:49:25.270 に答える
0

これを処理する古典的な方法は、「タイプセーフな異種コンテナー」を使用することです。

Map<Class<?>, IFace> faces;

public <T extends IFace> T getFace(Class<T> key) {
    return t.cast(faces.get(key));
}

インターフェイスのクラスを文字列ではなくキーとして使用すると、キーとして渡されたクラスを使用して、戻り値を適切な型に安全にキャストできます。

于 2013-08-11T14:51:33.750 に答える