標籤: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>){ //錯誤 } }}
java基礎 泛型