由於java的強型別,不同型別物件同一波操作而言,需要適配型別引數,會產生大量近似的重複程式碼。泛型本質引數型別化,滿足了這一需求。
泛型
public class MaximumTest {
public static void main(String[] args) {
System.out.printf("%d,%d和%d 中最大的數為 %d\n\n", 3, 4, 5, maximum(3, 4, 5));
System.out.printf("%.1f,%.1f和%.1f 中最大數為%.1f\n\n", 4.3,7.7,6.3,maximum(4.3, 7.7, 6.3));
}
private static <T extends Comparable<T>> T maximum(T x, T y, T z) {
T max = x;
if (y.compareTo(max) > 0) {
max = y;
}
if (z.compareTo(max) > 0) {
max = z;
}
return max;
}
}
泛型是類型別,天生為了模板而生。像上述程式碼若在golang中,意味著必須寫兩個針對不同引數型別相同邏輯的比較函式。從某種意義上來講,一般物件的型別描述了該物件具體是什麼,而泛型化的引數則說明了該引數可用型別範圍或區間或引數使用的型別必備某些限制性條件(比如要求型別實現某個介面或類),具有一定的靈活性。
範圍
List<?> data
型別萬用字元一般是使用?代替具體的型別引數List<? extends Number> data
萬用字元泛型值接受Number及其下層子類型別List<? super Number> data
表示型別只能接受Number及其三層父類型別
換而言之,extend或super指向引數是特定型別的子孫後代,還是它的千年老祖
型別
java的型別字面量,有一些小意思,比如長整形,浮點會以l,f
結尾,以強調它們各自型別性質的存在感。
至於陣列概念與Go一致,有序有長度Vector
向量型別 生來具有動態擴充套件性,這點同py,go
中的 slice
類似。從某種意義上講,陣列是其它資料結構的鼻祖,後續stack
之類大多是它的子孫後代。
型別轉換
型別由低到高轉換byte,short,char—> int —> long—> float —> double
- 容量大的型別轉換為容量小的型別必須進行強制型別轉換
- 浮點數到整數的轉換是捨棄小數得到的,而非四捨五入
本作品採用《CC 協議》,轉載必須註明作者和本文連結