Mik*_*era 52 java generics collections
的java.util.Properties类是代表一地图,其中键和值都是字符串.这是因为Properties对象用于读取.properties文件,文件是文本文件.
那么,为什么在Java 5中他们改进了这个类来实现Map<Object,Object>而不是Map<String,String>?
该javadoc的状态:
由于Properties继承自Hashtable,因此put和putAll方法可以应用于Properties对象.强烈建议不要使用它们,因为它们允许调用者插入其键或值不是字符串的条目.应该使用setProperty方法.如果在包含非String键或值的"受损"Properties对象上调用store或save方法,则调用将失败.
由于键和值都应该是字符串,那么为什么不使用正确的泛型类型静态强制执行呢?
我想制作Properties工具Map<String,String>不会完全向后兼容为Java 5之前编写的代码.如果你有旧的代码将非字符串粘贴到Properties对象中,那么该代码将不再用Java 5编译.但是... isn'那是件好事吗?在编译时捕获这种类型错误不是泛型的全部意义吗?
Mar*_*ing 53
因为他们在Java早期就匆匆忙忙做了这件事,并没有意识到后来四个版本会带来什么影响.
泛型应该从一开始就是Java设计的一部分,但是由于过于复杂而且当时没有必要,因此该功能被删除了.因此,标准库中的大量代码是在非泛型集合的假设下编写的.它采用了Martin Odersky的原型语言"Pizza",展示了如何在保持近乎完美的向后兼容性的同时,使用Java代码和字节码完成它们.原型开发了Java 5,其中的集合类使用泛型进行了改进,允许旧代码继续工作.
不幸的是,如果他们追溯Properties继承Map<String, String>,那么以下有效的代码将停止工作:
Map<Object, Object> x = new Properties()
x.put("flag", true)
Run Code Online (Sandbox Code Playgroud)
为什么有人会这样做是超出我的,但是Sun对Java的向后兼容性的承诺已经超越了英雄,变成了毫无意义.
大多数受过教育的观察者现在所欣赏的是,Properties根本不应该继承Map.它应该环绕Map,只暴露那些有意义的Map特征.
自从重新发明Java以来,Martin Odersky已经开始创建新的Scala语言,它更清晰,继承了更少的错误,并在许多领域开辟了新天地.如果你发现Java的烦恼很烦人,那就去看看吧.
Tom*_*ine 27
最初的意图Properties确实会扩展Hashtable<String,String>.不幸的是,桥接方法的实现引起了一个问题.Properties以这种方式定义会导致javac生成合成方法.Properties应该定义一个get返回a String但需要覆盖返回方法的方法Object.因此增加了一种合成桥接方法.
假设你有一个写在糟糕的旧1.4天的课程.你已经覆盖了一些方法Properties.但是你没有做的是覆盖了新的方法.这会导致意外行为.为避免这些桥接方法,请进行Properties扩展Hashtable<Object,Object>.类似地Iterable,不会返回(只读)SimpleIterable,因为这会为Collection实现添加方法.
Spa*_*jus 13
用于从属性创建Map的单行(双线无警告):
@SuppressWarnings({ "unchecked", "rawtypes" })
Map<String, String> sysProps = new HashMap(System.getProperties());
Run Code Online (Sandbox Code Playgroud)