2011-02-23 3 views
3

Est-il juste que ce codetypes génériques en Java

List<Integer> test2 = new ArrayList<Integer>(); 
test2.add(343); 
int x2 = test2.get(0); 

dans le temps de compilation seront convertis à cette

List test = new ArrayList(); 
test.add(343); 
int x = (Integer)test.get(0); 

Quelque chose de similaire avec autoboxing ...

Répondre

2

Essayons. Prenez cette classe avec deux méthodes qui font tout à fait la même chose avec et sans médicaments génériques et autoboxing:

public class GenericTest{ 

    // use generics and auto-boxing 
    // Java 1.5 or higher required 
    public void generic(){ 
     final List<Integer> test2 = new ArrayList<Integer>(); 
     test2.add(343); 
     final int x2 = test2.get(0); 
    } 

    // use neither generics nor auto-boxing, 
    // this should be Java 1.4-compatible 
    public void nonGeneric(){ 
     final List test2 = new ArrayList(); 
     test2.add(Integer.valueOf(343)); 
     final int x2 = ((Integer) test2.get(0)).intValue(); 
    } 
} 

Voici le code octet:

// Compiled from GenericTest.java (version 1.6 : 50.0, super bit) 
public class GenericTest { 

    // Method descriptor #6()V 
    // Stack: 1, Locals: 1 
    public GenericTest(); 
    0 aload_0 [this] 
    1 invokespecial java.lang.Object() [8] 
    4 return 
     Line numbers: 
     [pc: 0, line: 4] 
     Local variable table: 
     [pc: 0, pc: 5] local: this index: 0 type: GenericTest 

    // Method descriptor #6()V 
    // Stack: 2, Locals: 3 
    public void generic(); 
    0 new java.util.ArrayList [16] 
    3 dup 
    4 invokespecial java.util.ArrayList() [18] 
    7 astore_1 [test2] 
    8 aload_1 [test2] 
    9 sipush 343 
    12 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [19] 
    15 invokeinterface java.util.List.add(java.lang.Object) : boolean [25] [nargs: 2] 
    20 pop 
    21 aload_1 [test2] 
    22 iconst_0 
    23 invokeinterface java.util.List.get(int) : java.lang.Object [31] [nargs: 2] 
    28 checkcast java.lang.Integer [20] 
    31 invokevirtual java.lang.Integer.intValue() : int [35] 
    34 istore_2 [x2] 
    35 return 
     Line numbers: 
     [pc: 0, line: 7] 
     [pc: 8, line: 8] 
     [pc: 21, line: 9] 
     [pc: 35, line: 10] 
     Local variable table: 
     [pc: 0, pc: 36] local: this index: 0 type: GenericTest 
     [pc: 8, pc: 36] local: test2 index: 1 type: java.util.List 
     [pc: 35, pc: 36] local: x2 index: 2 type: int 
     Local variable type table: 
     [pc: 8, pc: 36] local: test2 index: 1 type: java.util.List<java.lang.Integer> 

    // Method descriptor #6()V 
    // Stack: 2, Locals: 3 
    public void nonGeneric(); 
    0 new java.util.ArrayList [16] 
    3 dup 
    4 invokespecial java.util.ArrayList() [18] 
    7 astore_1 [test2] 
    8 aload_1 [test2] 
    9 sipush 343 
    12 invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [19] 
    15 invokeinterface java.util.List.add(java.lang.Object) : boolean [25] [nargs: 2] 
    20 pop 
    21 aload_1 [test2] 
    22 iconst_0 
    23 invokeinterface java.util.List.get(int) : java.lang.Object [31] [nargs: 2] 
    28 checkcast java.lang.Integer [20] 
    31 invokevirtual java.lang.Integer.intValue() : int [35] 
    34 istore_2 [x2] 
    35 return 
     Line numbers: 
     [pc: 0, line: 13] 
     [pc: 8, line: 14] 
     [pc: 21, line: 15] 
     [pc: 35, line: 16] 
     Local variable table: 
     [pc: 0, pc: 36] local: this index: 0 type: GenericTest 
     [pc: 8, pc: 36] local: test2 index: 1 type: java.util.List 
     [pc: 35, pc: 36] local: x2 index: 2 type: int 
} 

Je ne vois aucune différence évidente entre le générique et la version non générique, en fait, est ici le résultat diff pour les deux méthodes:

< public void generic(); 
--- 
> public void nonGeneric(); 
19,22c19,22 
<   [pc: 0, line: 7] 
<   [pc: 8, line: 8] 
<   [pc: 21, line: 9] 
<   [pc: 35, line: 10] 
--- 
>   [pc: 0, line: 13] 
>   [pc: 8, line: 14] 
>   [pc: 21, line: 15] 
>   [pc: 35, line: 16] 
27,28d26 
<  Local variable type table: 
<   [pc: 8, pc: 36] local: test2 index: 1 type: java.util.List<java.lang.Integer> 

Comme vous pouvez le voir, la seule différence est dans les numéros de ligne et local table de variables.

+0

Merci beaucoup, c'est maintenant presque clair! –

+0

Cela ferait-il une différence si cela était compilé avec un compilateur 1.4? – corsiKa

+0

@glowcoder la première méthode ne compilerait pas avec un compilateur 1.4, et la seconde serait identique, c'est tout le point de ce type de merde d'effacement. –

1

Oui.

[[remplissage obligatoire pour atteindre> 30 caractères]]

3

Oui, sauf que "test2.add (343);" ne changera pas en "test.add (43);"

+0

je l'ai copié à partir du livre scjp, donc il est important de leur dire que leur code est un peu confus :) –

1

Oui:

List test = new ArrayList(); 
test.add(Integer.valueOf(343)); 
int x = ((Integer) test.get(0)).intValue(); 
+0

Merci, oublié à propos de l'autoboxing –