沃日,不知道被那本书忽悠了,下面两种方式使用泛型其实性能上没有差别,区别的只是自己手动写强制类型转换或者是编译器做强制类型转换(语法糖解析)。。。我就奇怪了这个cast操作怎么会省掉了。。。
List a=new LinkedList<String>();
String s=(String)a.get(1);
List<String> b=new LinkedList<String>();
s=b.get(1);对应的bytecode,经测试的确性能上没有区别。 NEW LinkedList
DUP
INVOKESPECIAL LinkedList.<init>() : void
ASTORE 1
ALOAD 1: a
ICONST_1
INVOKEINTERFACE List.get(int) : Object
CHECKCAST String?
ASTORE 2
NEW LinkedList
DUP
INVOKESPECIAL LinkedList.<init>() : void
ASTORE 3
ALOAD 3: b
ICONST_1
INVOKEINTERFACE List.get(int) : Object
CHECKCAST String?
ASTORE 2: s?
?
c#真实泛型,这个泛型信息一直保留到nativecode中,不知道如何在规避类型膨胀的前提下做到了所有引用类型只生成一份nativecode(《CLR via c#》提到这一点),如果按照这种方式实现,按照道理应该和java一样要做一次强制类型转换,性能优势何在?了解的同学不吝赐教啊,捣鼓了下反汇编还没能整清楚。。。