The java.util.Properties
class is meant to represent a map where the keys and values are both Strings. This is because Properties
objects are used to read .properties
files, which are text files.
So, why in Java 5 did they retrofit this class to implement Map<Object,Object>
and not Map<String,String>
?
The javadoc states:
Because Properties inherits from Hashtable, the put and putAll methods can be applied to a Properties object. Their use is strongly discouraged as they allow the caller to insert entries whose keys or values are not Strings. The setProperty method should be used instead. If the store or save method is called on a "compromised" Properties object that contains a non-String key or value, the call will fail.
Since the keys and values are both supposed to be Strings then why not enforce that statically by using the proper generic type?
I guess making Properties
implement Map<String,String>
would not be fully backward compatible with code written for pre-Java 5. If you have older code that sticks non-strings into a Properties object then that code would no longer compile with Java 5. But... isn't that a good thing? Isn't the whole point of generics to catch such type errors at compile time?