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 扩展IFace。您可能在某些时候将 a 转换 B_FaceA_Face类型不安全的 a。

于 2013-08-11T13:12:50.650 回答
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 回答
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);
}

因此,您将 at classthanextends Object放入您的Map(so any class) 中。

但是,当您调用时,getThing您正在对所需类型进行隐式转换。很明显,我也可以getThing用 any调用class它,它会盲目地尝试转换它。

在上面的示例中,我将一些东西放入 myMap中,然后尝试将它们全部检索为Calendars。

于 2013-08-11T13:49:25.270 回答