类型 VS 泛型
由于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 协议》,转载必须注明作者和本文链接