泛型
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
容量大的类型转换为容量小的类型必须进行强制类型转换
浮点数到整数的转换是舍弃小数得到的,而非四舍五入