Think in java 里面的泛型问题
擦除机制
Java中的泛型基本上都是在编译器这个层次来实现的,在生成的Java字节码中是不包含泛型中的类型信息的。
使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉,这个过程就称为类型擦除。
例如
List<Object> 和 List<String> 会被擦除机制变成 List
JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的
泛型类型只有在静态类型检查期间才会出现,在此之后,所以泛型类型都将被擦除,替换为他们的非泛型上界
泛型列表中 entends 定义泛型上界 super 定义了泛型下界
例如 <Has extends HasP> 那么泛型 Has 在静态类型检查期间才会出现,那么在之后,Has会被擦除,替换为 HasP 这个泛型上界
如果泛型列表中没有定义泛型的上界,那么泛型在擦除机制的作用下会变成 Object
擦除丢失了在泛型代码中执行某些操作的能力 任何在运行时需要知道确切类型信息的操作都无法完成
泛型的自限定
自限定将强制泛型当做自己的边界参数来使用。
评论
发表评论