将 java.util.Properties 转换为 HashMap<String,String>

2022-08-31 10:05:10
Properties properties = new Properties();
Map<String, String> map = new HashMap<String, String>(properties);// why wrong?

java.util.Propertiesjava.util.Map的实现,java.util.HashMap的构造函数接收类型参数。那么,为什么必须显式转换它呢?Map


答案 1

这是因为属性扩展了 Hashtable<Object,Object>(反过来,实现)。您尝试将其输入到 .因此,它是不兼容的。Map<Object, Object>Map<String, String>

您需要将字符串属性逐个馈送到您的地图中...

例如:

for (final String name: properties.stringPropertyNames())
    map.put(name, properties.getProperty(name));

答案 2

执行此操作的有效方法是仅转换为通用 Map,如下所示:

Properties props = new Properties();

Map<String, String> map = (Map)props;

这会将 a 转换为原始 Map,这对于编译器来说是“ok”(仅警告)。一旦我们有了一个原始的,它就会被投射到它身上,它也将是“ok”(另一个警告)。您可以使用注释忽略它们Map<Object, Object>MapMap<String, String>@SuppressWarnings({ "unchecked", "rawtypes" })

这将起作用,因为在JVM中,对象实际上没有泛型类型。泛型类型只是在编译时验证事物的一个技巧。

如果某些键或值不是字符串,则会产生错误。在当前实现中,这种情况不太可能发生,只要您不使用 super of 中的可变调用方法即可。ClassCastExceptionPropertiesHashtable<Object,Object>Properties

因此,如果不对属性实例执行令人讨厌的操作,这就是要走的路。


推荐