标签:log 擦除 画布 info 集合 out 成员类 string .class
1.泛型集合中的元素是存在继承关系的
public class Main { public static void main(String[] args) { List<Shape> list=new ArrayList<Shape>(); list.add(new Circle()); list.add(new Rectangle()); } } class Canva { public void drawAll(List<? extends Shape> list) { for (Shape s : list) { s.draw(this); } } } abstract class Shape { public abstract void draw(Canva c); } class Circle extends Shape { @Override public void draw(Canva c) { System.out.println("在画布" + c + "画圆"); } } class Rectangle extends Shape { @Override public void draw(Canva c) { System.out.println("在画布" + c + "画矩形"); } }
2.泛型类中的泛型不能设置到静态成员中
泛型实际上就是将运行时期出现的错误,放到编译时期,在运行时实际会擦除泛型类型,静态成员属性类成员,所有对象共享,如果运行泛型类型那么也就是在实例中静态成员的类型可以不一样,这样违背了java静态成员的语法
class Apple<T>{ public static T color; //泛型类型不能应用到静态成员上 private T info; public Apple() { } public Apple(T info) { this.info = info; } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } }
3.在编写泛型类子类时,继承的泛型类必须是原生类或泛型类型明确的泛型类
原因:如果创建c类对象,实际jvm也会为我们创建父类Apple类的对象,但是Apple类中成员类型缺是未知的
class A extends Apple<String>{ } class B extends Apple{ } class C extends Apple<T>{ //错误 }
4.泛型类不是真正的类
泛型类不是真正的类,只是编译时期的一种类型表示方式,在运行时期会擦除泛型类型变成原生类,比如:List<String>不存在这种类型的类,也不会生成对应的class文件,运行时期原生类时List,产生的class文件是List.class ,所以对于List<String>.class或instanceof的使用都是错误的
public class Main { public static void main(String[] args) { List<String> list=new ArrayList<>(); System.out.println(List<String>.class); //错误 if(list instanceof List<Object>){ //错误 } } }
标签:log 擦除 画布 info 集合 out 成员类 string .class
原文地址:http://www.cnblogs.com/tomcuper/p/7799241.html