Re: java.util.Properties extending from HashMap<Object, Object> instead of HashMap<String, String>



On Fri, 04 Apr 2008 13:16:47 -0400, Owen Jacobson <angrybaldguy@xxxxxxxxx> wrote:

On Apr 4, 12:14 pm, Rakesh <rakesh.use...@xxxxxxxxx> wrote:
I was curious if there is a reason why java.util.Properties extends
from HashMap<Object, Object> instead of  HashMap<String, String>
(seems more intuitive to me).

A variation of that would be -
   how do we get about converting Properties to Map<String, String> .

Backwards compatability. In Java 1.4 and earlier,
Properties.get(Object) returned Object; changing that signature for
1.5 would break any code that used that method without an immediate
cast to String.

-o

I don't think this is the reason. Particularly, making a method signature generic does not change it's runtime signature.

Even if Properties were made as "Properties extends HashMap<String,String>"
Properties.get will inherit the Map.get signature, which is just:

java/util/Map.get(Ljava/lang/Object;)Ljava/lang/Object;

and thus runtime compatibility is preserved. At the compiler's option, additional synthetic bridge methods may be created in order to support covariant return types, but even then, a method with a Ljava/lang/Object return type must exist at runtime.

Additionally, the parameter "key" of Map.get is not generified: all Maps accept java.lang.Object as a key, under the premis that if you pass in a different type then it can't possibly have a previous mapping.

Thus code calling "Properties.get(new Object())" would still be compatible at compile time.

Lastly, all Strings are assignable as Objects. Thus code calling "Object x=Properties.get(key)" will also still be compile-time compatible.

I think the real reason Properties does not extend Hashtable<String,String> is that, while discouraged, it is still valid to have Properties with non-string key/values. An existing Java 1.4 API could something like:

public Properties createProps() {
Properties props=new Properties();
props.setProperty("name", "foo");
props.put("version", new Integer());
return props;
}

If this method existed, and you were tasked with calling this method such as:

Integer version=(Integer) createProps().get("version");

This code would likely not compile in Java 5 if properties was made as Hashtable<String,String>, and users would be "locked in" to using Java 1.4 as long as they continued to use this API.

HTH,

-Zig
.



Relevant Pages

  • Re: Strong Names and LGPL
    ... This way it will compile as-is without complaining. ... >> to apply a strong name signature to the existing compiled DLL, ... >> said, I'm no expert on the LGPL, and you might have get more educated ... >> You would be no worse off than if you were using a private key inherited ...
    (microsoft.public.dotnet.security)
  • Re: Should this type of method overload work in C#?
    ... The method signature is determined at compile time. ... The method overload is determined at run time. ... whether the base class method or the child class method is to be called ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Delegates and the Invoke method
    ... compile. ... int ... and I think the compiler did fail if you set ptrFunction to a ... function with the wrong signature. ...
    (microsoft.public.dotnet.languages.csharp)
  • Compiling string of code: problem
    ... I'm trying to use a string to define some code, and then compile this code ... signature:= ''. ... char:= charCode asSymbol asString. ...
    (comp.lang.smalltalk)
  • Re: MarshalByRefObject
    ... > below my signature in the previous ... cut and paste your code, compile it, run it and see the problem. ... If replying to the group, please do not mail me too ... Prev by Date: ...
    (microsoft.public.dotnet.languages.csharp)