Aufruf von generischen Methoden muss mit Object erfolgen und nocht der Instanz #98

Open
opened 2023-01-23 10:02:32 +00:00 by pl · 1 comment
Owner
import java.util.Vector;
import java.lang.Integer;
import java.lang.String;

class WildcardCaptureConversionTest {

	m(x, y ,z) {
		x = new Vector<Integer>();
		y = new Vector<String>();
		x.add(1);
		y.add("2");
		//Integer i = x.elementAt(0);
		//String s = y.elementAt(0);
	    return 	z.vectorAddAll(x, y);
	}
} 

erzeugt

 public WildcardCaptureConversionTest();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [10]
    4  return

  
  // Method descriptor #12 (Ljava/util/Vector;Ljava/util/Vector;LVectorNotObject;)Ljava/util/Vector;
  // Signature: <>(Ljava/util/Vector<Ljava/lang/Integer;>;Ljava/util/Vector<Ljava/lang/String;>;LVectorNotObject;)Ljava/util/Vector<+Ljava/lang/Object;>;
  // Stack: 3, Locals: 4
  public java.util.Vector m(java.util.Vector arg0, java.util.Vector arg1, VectorNotObject arg2);
     0  new java.util.Vector [15]
     3  dup
     4  invokespecial java.util.Vector() [16]
     7  dup
     8  astore_1 [arg0]
     9  pop
    10  new java.util.Vector [15]
    13  dup
    14  invokespecial java.util.Vector() [16]
    17  dup
    18  astore_2 [arg1]
    19  pop
    20  aload_1 [arg0]
    21  ldc <Integer 1> [17]
    23  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [23]
    26  invokevirtual java.util.Vector.add(java.lang.Integer) : java.lang.Boolean [27]
    29  invokevirtual java.lang.Boolean.booleanValue() : boolean [33]
    32  pop
    33  aload_2 [arg1]
    34  ldc <String "2"> [35]
    36  invokevirtual java.util.Vector.add(java.lang.String) : java.lang.Boolean [38]
    39  invokevirtual java.lang.Boolean.booleanValue() : boolean [33]
    42  pop
    43  aload_3 [arg2]
    44  aload_1 [arg0]
    45  aload_2 [arg1]
    46  invokevirtual VectorNotObject.vectorAddAll(java.util.Vector, java.util.Vector) : java.util.Vector [44]
    49  areturn

}

Falsch ist:

    23  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [23]
    26  invokevirtual java.util.Vector.add(java.lang.Integer) : java.lang.Boolean [27]
    29  invokevirtual java.lang.Boolean.booleanValue() : boolean [33]
    32  pop
    33  aload_2 [arg1]
    34  ldc <String "2"> [35]
    36  invokevirtual java.util.Vector.add(java.lang.String) : java.lang.Boolean [38]
    39  invokevirtual java.lang.Boolean.booleanValue() : boolean [33]
    42  pop

richtig wäre:

    18  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [10]

    //Das Argument muss java.lang.Object sein
    21  invokevirtual java.util.Vector.add(java.lang.Object) : boolean [16]
    24  pop
    25  aload_2 [arg1]
    26  ldc <String "2"> [20]

    //Das Argument muss java.lang.Object sein
    28  invokevirtual java.util.Vector.add(java.lang.Object) : boolean [16]
    //Der Return ist boolean und nicht Bollen. Daher keine Konvertierung noetig
``` import java.util.Vector; import java.lang.Integer; import java.lang.String; class WildcardCaptureConversionTest { m(x, y ,z) { x = new Vector<Integer>(); y = new Vector<String>(); x.add(1); y.add("2"); //Integer i = x.elementAt(0); //String s = y.elementAt(0); return z.vectorAddAll(x, y); } } ``` erzeugt ``` public WildcardCaptureConversionTest(); 0 aload_0 [this] 1 invokespecial java.lang.Object() [10] 4 return // Method descriptor #12 (Ljava/util/Vector;Ljava/util/Vector;LVectorNotObject;)Ljava/util/Vector; // Signature: <>(Ljava/util/Vector<Ljava/lang/Integer;>;Ljava/util/Vector<Ljava/lang/String;>;LVectorNotObject;)Ljava/util/Vector<+Ljava/lang/Object;>; // Stack: 3, Locals: 4 public java.util.Vector m(java.util.Vector arg0, java.util.Vector arg1, VectorNotObject arg2); 0 new java.util.Vector [15] 3 dup 4 invokespecial java.util.Vector() [16] 7 dup 8 astore_1 [arg0] 9 pop 10 new java.util.Vector [15] 13 dup 14 invokespecial java.util.Vector() [16] 17 dup 18 astore_2 [arg1] 19 pop 20 aload_1 [arg0] 21 ldc <Integer 1> [17] 23 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [23] 26 invokevirtual java.util.Vector.add(java.lang.Integer) : java.lang.Boolean [27] 29 invokevirtual java.lang.Boolean.booleanValue() : boolean [33] 32 pop 33 aload_2 [arg1] 34 ldc <String "2"> [35] 36 invokevirtual java.util.Vector.add(java.lang.String) : java.lang.Boolean [38] 39 invokevirtual java.lang.Boolean.booleanValue() : boolean [33] 42 pop 43 aload_3 [arg2] 44 aload_1 [arg0] 45 aload_2 [arg1] 46 invokevirtual VectorNotObject.vectorAddAll(java.util.Vector, java.util.Vector) : java.util.Vector [44] 49 areturn } ``` Falsch ist: ``` 23 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [23] 26 invokevirtual java.util.Vector.add(java.lang.Integer) : java.lang.Boolean [27] 29 invokevirtual java.lang.Boolean.booleanValue() : boolean [33] 32 pop 33 aload_2 [arg1] 34 ldc <String "2"> [35] 36 invokevirtual java.util.Vector.add(java.lang.String) : java.lang.Boolean [38] 39 invokevirtual java.lang.Boolean.booleanValue() : boolean [33] 42 pop ``` richtig wäre: ``` 18 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [10] //Das Argument muss java.lang.Object sein 21 invokevirtual java.util.Vector.add(java.lang.Object) : boolean [16] 24 pop 25 aload_2 [arg1] 26 ldc <String "2"> [20] //Das Argument muss java.lang.Object sein 28 invokevirtual java.util.Vector.add(java.lang.Object) : boolean [16] //Der Return ist boolean und nicht Bollen. Daher keine Konvertierung noetig ```
Owner

Das Beispiel funktioniert nicht wegen vectorAddAll, das ist nicht definiert.

Das Beispiel funktioniert nicht wegen `vectorAddAll`, das ist nicht definiert.
dholle added the
invalid
label 2024-03-05 09:55:37 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#98
No description provided.