Java SE 6中的Properies类有一个名为setProperty(String key, String value)
的方法,它返回Object
。此外,为此密钥存储了先前的Object
,如果不存在,则为NULL
。
由于setProperty(String key, String value)
只能将String
作为值,为什么该方法不会返回String
?
答案 0 :(得分:14)
不幸的是,类java.util.Properties
被引入到java 1.0中,比仿制药早多年。 Properties
扩展了可以存储任何类型数据的Hashtable
。因此,您可以执行以下操作:
Properties props = new Properties();
props.put("key", new Object()); // use Hashtable's put method
props.setProperty("key", "value"); // use Proerties' setProperty method
在此示例中,setProperty
必须返回此条目中存储的先前值,即Object
。但它不是String
!为了避免ClassCastException
,JDK创建者必须将setProperty()
定义为返回Object
的方法。
BTW即使现在类属性也实现Map<Object, Object>
而不是Map<String, String>
以实现向后兼容。
答案 1 :(得分:13)
因为属性从一开始就被误解,扩展了Hashtable,它可以存储任何东西。因此,设计不尊重Liskov替换原则:基类可以做的所有事情,子类必须能够做到。
由于Properties扩展了Hashtable,你实际上可以在其中存储任何类型的Object。