我很确定这是类型安全的,但只是想检查一下 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 扩展IFace
。您可能在某些时候将 a 转换 B_Face
为A_Face
类型不安全的 a。
处理此问题的经典方法是使用“类型安全的异构容器”:
Map<Class<?>, IFace> faces;
public <T extends IFace> T getFace(Class<T> key) {
return t.cast(faces.get(key));
}
您将接口的类用作键,而不是字符串,然后您可以使用作为键传递的类来安全地将返回值转换为正确的类型。
看看极端情况。可以说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 class
thanextends Object
放入您的Map
(so any class
) 中。
但是,当您调用时,getThing
您正在对所需类型进行隐式转换。很明显,我也可以getThing
用 any调用class
它,它会盲目地尝试转换它。
在上面的示例中,我将一些东西放入 myMap
中,然后尝试将它们全部检索为Calendar
s。