public Configuration(Node node, File file) {
HashMap<String, String> conf = (HashMap<String, String>) SerializationUtils.deserialize(new FileInputStream(file));
}
我明白为什么会出现不安全的转换警告,但是有没有最好/被接受的方法来安全地执行这个操作?是否有任何好的方法?
public Configuration(Node node, File file) {
HashMap<String, String> conf = (HashMap<String, String>) SerializationUtils.deserialize(new FileInputStream(file));
}
我明白为什么会出现不安全的转换警告,但是有没有最好/被接受的方法来安全地执行这个操作?是否有任何好的方法?
仅使用Java语言无法完全以类型安全的方式处理此情况。
由于这是必须反复执行的操作,而且你真的无法绕过它,我建议使用一种通用方法来读取和转换通用对象:
@SuppressWarnings("unchecked")
public static <T> T readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
return (T)in.readObject();
}
然而,我建议您不要通常使用此类方法来抑制有效的警告。
由于在运行时(即发生强制转换时)通过称为“擦除”的过程无法获得所需的编译时类型信息(即String
),因此没有真正正确的方法来执行此操作。我认为最好的方法是将反序列化的集合传递给一些定制的“检查器”:
Map<?,?> conf = deserialize(rsrc);
Map<String, String> checked = checkMap(conf, String.class, String.class);
//can use checked freely
其中:
@SuppressWarnings("unchecked")
public static <K, V> Map<K,V> checkMap(Map<?,?> map, Class<? extends K> k, Class<? extends V> v) {
for (Map.Entry<?, ?> e : map) {
k.cast(e.getKey()); //will throw ClassCastException
v.cast(e.getValue());
}
return (Map<K,V>) map; //unchecked
}
check
方法的错误。我已经在我的答案中添加了更多细节。该方法只是没有设计成以这种方式工作,因此可以如此记录文档。 - oxbow_lakespublic static <T> T readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
@SuppressWarnings("unchecked")
T val = (T)in.readObject();
return val;
}
很遗憾,您目前无法向表达式添加注释(至少还不行)。