是不是这个代码泛型类型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);
东西...
是不是这个代码泛型类型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);
东西...
让我们试试。就拿这个类有两个方法,这样做完全同样的事情,并没有泛型和自动装箱:
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>
正如你看到的,唯一的区别是行号和本地变量表。
是。
[[强制填料以实现> 30个字符]]
是的,所不同的是 “test2.add(343);”不会变成“test.add(43);”
我从scjp书复制它,所以它是正确的问题,他们的代码是有点困惑:) – 2011-02-23 16:37:18
是:
List test = new ArrayList();
test.add(Integer.valueOf(343));
int x = ((Integer) test.get(0)).intValue();
谢谢,忘了关于自动装箱 – 2011-02-23 16:38:53
非常感谢,现在几乎清楚! – 2011-02-23 16:43:03
如果这是使用1.4编译器编译的,它会有所作为吗? – corsiKa 2011-02-23 16:52:50
@glowcoder第一种方法不会用1.4编译器编译,第二种方法是相同的,这就是这种类型擦除废话的全部意义。 – 2011-02-23 16:56:00