刚好我看了java语法糖部分知识,类型擦出属于一种语法糖,所谓语法糖,指添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。 以下为你那段代码编译为class文件,再反编译出来的代码,即为类型擦出后的代码。可以看到第10行,List<Integer> intList=list;经过类型擦除后已经变成了List intList = list; import java.io.PrintStream; import java.util.ArrayList; import java.util.List;public class RawTypeTest { public static void main(String[] args) { List list = new ArrayList(); list.add("ab"); list.add("cd"); List intList = list; for (int i = 0; i < intList.size(); ++i) System.out.println(intList.get(i)); } }而List list = new ArrayList();在执行了这一句之后,list的类型估计应该默认是Object了,而在赋值给intList后,类型是不会变得,所以以下代码估计在执行的会是下面那段代码 public E get(int index) { RangeCheck(index); return (E) elementData[index];//执行到这个位置,不会发生类型转换异常吗? } public Object get(int index) { RangeCheck(index); return (Object) elementData[index];//执行到这个位置,不会发生类型转换异常吗? } 这只是我的理解,有不对的地方,请大家指出
以下为你那段代码编译为class文件,再反编译出来的代码,即为类型擦出后的代码。可以看到第10行,List<Integer> intList=list;经过类型擦除后已经变成了List intList = list;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;public class RawTypeTest
{
public static void main(String[] args)
{
List list = new ArrayList();
list.add("ab");
list.add("cd");
List intList = list; for (int i = 0; i < intList.size(); ++i)
System.out.println(intList.get(i));
}
}而List list = new ArrayList();在执行了这一句之后,list的类型估计应该默认是Object了,而在赋值给intList后,类型是不会变得,所以以下代码估计在执行的会是下面那段代码
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];//执行到这个位置,不会发生类型转换异常吗?
}
public Object get(int index) {
RangeCheck(index);
return (Object) elementData[index];//执行到这个位置,不会发生类型转换异常吗?
}
这只是我的理解,有不对的地方,请大家指出
java的泛型被称为伪泛型,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原生类型(Raw Type,也称裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的java语言来说,List<Integer>与List<String>就是一个类。所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。
intList.get(i)//泛型擦除后->返回为Object
但是如果这样
Integer in=inList.get(i)//发生String can not cast Integer谢谢了