2011-02-23 110 views
3

是不是这个代码泛型类型Java中

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

在编译的时候将被转换为这个自动装箱类似

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

东西...

回答

2

让我们试试。就拿这个类有两个方法,这样做完全同样的事情,并没有泛型和自动装箱:

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(); 
    } 
} 

这里的字节码:

// 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 
} 

我没有看到通用之间的任何明显区别非通用版本,其实这里有两个方法diff结果:

< 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> 

正如你看到的,唯一的区别是行号和本地变量表。

+0

非常感谢,现在几乎清楚! – 2011-02-23 16:43:03

+0

如果这是使用1.4编译器编译的,它会有所作为吗? – corsiKa 2011-02-23 16:52:50

+0

@glowcoder第一种方法不会用1.4编译器编译,第二种方法是相同的,这就是这种类型擦除废话的全部意义。 – 2011-02-23 16:56:00

1

是。

[[强制填料以实现> 30个字符]]

3

是的,所不同的是 “test2.add(343);”不会变成“test.add(43);”

+0

我从scjp书复制它,所以它是正确的问题,他们的代码是有点困惑:) – 2011-02-23 16:37:18

1

是:

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

谢谢,忘了关于自动装箱 – 2011-02-23 16:38:53