public
class a
public t get()
}
當使用者建立a類物件時,就會給a類的型別變數t賦值。如new a(),這說明a類中所有的t都會被string替換。
public
class a
public
string
get()
}
泛型類說明這個類有型別變數,在建立這個類物件時需要給型別變數賦值。泛型方法是說明這個方法有型別變數,在呼叫這個方法的時候需要給型別變數賦值。
public
t get(tts,int index)
注意,在返回值前面定義型別變數。
get()方法是乙個泛型方法,他有乙個型別變數t,這說明在呼叫get方法的時候需要給get方法的t賦值。
如果要定義有意義的泛型方法需要:
1.引數需要使用型別變數
2.返回值需要使用型別變數
所有通常在呼叫泛型方法時,只需要傳遞引數就可以了。
string str;
string s = o.get(str,0);
上面**中給get方法的型別變數賦值string,因為傳遞引數是string。
編譯期狀態,例如內部類,只有編譯器知道,jvm不認識。
object objs = new string[10];
objs[0] = new integer(100);
上面**編譯是可以通過的,但在執行時會出現arraystoreexception。因為objs陣列真實的身份是string,向string陣列中存放integer物件當然是不行的。
arraylist list = new arraylist();
list.add(new integer(100);
上面**在第一行位置編譯失敗,因為泛型根本就不讓把arraylist賦值給arraylist,對於arraylist而言,只能賦值arraylist,其他的什麼都不能賦值。
這也說明乙個問題:
public static void printlist(list list)
呼叫printlist()方法只能傳遞給它list型別的引數,而不能傳遞list,或者list,這說明我們的printlist()方法有很多的限制,不夠通用!!!你可能會想我再過載幾次printlist()方法吧,但這是行不通的!
public static void printlist(list list)
public static void printlist(list list)
因為jvm不知道什麼是泛型,這兩個方法在到了jvm那裡時都是會把泛型引數擦除,這兩個方法就是相同的方法了,擦除之後即:
public static void printlist(list list)
public static void printlist(list list)
當然jvm不可能看到這樣的**,因為編譯器不能讓你編譯通過!
處理這個問題需要使用萬用字元!
2 子型別萬用字元
public static void printlist(list
增強for迴圈的格式
增強for優缺點
增強for與iterable介面
Java 集合之泛型詳解
泛型表示集合中儲存資料的型別 儲存字串 arrayliste就代表 要儲存的元素型別 後面的尖括號 要跟前面填的泛型保持一致 如果前面宣告了泛型 後面泛型可以省略不寫 省略不寫 表示型別一致 jdk1.7 菱形泛型 public static void fun1 寫泛型編譯期就會報錯 public ...
Java 泛型詳解
普通泛型 public class point public void setvar t var public string tostring public class notepad public v getvalue public void setkey k key public void se...
Java 泛型詳解
表示集合中 儲存的資料型別 實現 泛型類 泛型類 泛型類 宣告時 尖括號中的字母 可以隨便定義 泛型類的型別在 初始化這個類的物件的時候確定 public class worker public void setm m m public void work public void sayhi m m...