我的代码类型安全吗?

时间:2013-08-11 13:09:12

标签: java type-safety

我很确定这是类型安全的,但只是想检查一下Eclipse是否要求我添加@SuppressWarnings("unchecked")注释。

Map<String, IFace> faces;

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

3 个答案:

答案 0 :(得分:4)

它不是类型安全的。你在这里向上转换,所以如果你转换为不兼容的派生类,你会在某个时候遇到错误。

例如A_FaceB_Face都延伸IFace。您可能会在某个时候将B_Face作为A_Face投射,这不是类型安全的。

答案 1 :(得分:0)

看看极端情况。让我们说IFaceObject,你的代码看起来像这样:

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);
}

所以你将class而不是extends Object放入Map(所以任何class)。

但是,当你调用getThing时,你正在对你想要的类型进行隐式转换。很明显,我也可以用任何getThing调用class,它会盲目地尝试投射它。

在上面的示例中,我将一些内容放入Map,然后尝试将它们全部检索为Calendar

答案 2 :(得分:0)

处理此问题的一种经典方法是使用“typesafe异构容器”:

Map<Class<?>, IFace> faces;

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

您使用接口的类作为键而不是字符串,然后您可以使用作为键传递的类来安全地将返回值强制转换为正确的类型。