Jeroen Frijters said the following on 09/07/10 13:58:
Martin Buchholz wrote:
On Sat, Sep 4, 2010 at 02:02, Jeroen Frijters <jer...@sumatra.nl> wrote:


        Sorry to be late with my comment, but as a VM implementer I can't
really agree with this modification. The return type of X[].clone() is
clearly Object, not X{]. That illusion is a javac compiler trick. IMHO
it belongs in the JLS not in the Object.clone() documentation.

I agree there is a little bit of cheating going on, but I don't agree
that the return type of X[].clone() is a "javac compiler trick".  In
some sense all compile-time types are javac-created illusions.

Here's what javac generates:

public static void main(java.lang.String[])
  Code:
   0:   aload_0
   1:   invokevirtual   #2; //Method 
"[Ljava/lang/String;".clone:()Ljava/lang/Object;
   4:   checkcast       #3; //class "[Ljava/lang/String;"
   7:   iconst_0
   8:   ldc     #4; //String
   10:  aastore
   11:  return

If you read this from the VM perspective (is there any other ;-)), you see that 
the VM needs to provide a public clone method on the type String[] that returns 
Object.

The previous text made this obvious, with the change, you explicitly need to 
understand the (external) fact that the text is talking about javac behavior, 
not a feature of the VM (or class library).

I agree that the change makes life easier for the Java developers that use 
Javac (i.e. the Java programming language), but since the JVM tries to be a 
more hospitable environment to multiple languages, I don't agree in favoring 
the Java programming language like this in the API docs.

I must be missing something subtle here. Object.clone() is required to return an object that is the same type as the object upon which clone() was invoked. The change simply clarifies this fact for the case of arrays.

The fact that Object.clone() is implemented via a native call into the VM is simply an implementation detail. I don't see how this clarification changes the requirements that are placed on how the VM implements this - it must return an object of the correct type.

David Holmes

Reply via email to