为了生存,代码大跃进。首先自己谴责自己一下:第一次破坏制度,漏传博客,感谢hammer的提醒,习惯一定要坚持。以后请Gizing和Hammer两位小伙伴多多监督。
高级语言与低级语言相比,其重点处理的地方是隐藏好与机器相关的部分,使得语言尽可能地与自然语言相一致。JAVA泛型解决的问题主要是减少程序中的类型转换代码,同时规范由于继承关系产生的运行错误。
类型转换的例子是:
Public class WrapperDemo{
Public static void main(String[] args){
MemoryCell11 m = new MemoryCell();//请自动忽略这个是什么类
m.write(new Integer(37));
Integer wrapperVal = (Integer) m.read();
Int val = wrapperVal.intValue();
System.out.println(“Contents are:” + val);
}
}
如果没有自动装箱/拆箱等,类型转换必须书写
继承关系的例子是:
Person[] arr = new Employee[5];
Arr[0] = new Student(…);
上面两个语句在编译时,完全没有语法错误,因为student IS A person。但是运行时,JVM会抛出ClassCastException,因为没有进行类型转换,用arr[0]调用Employee方法是不合理的。
简单的介绍泛型:
最基础的泛型版本:
Public class GenericMemoryCell<AnyType>{
Public AnyType read()
{
Return storedValue;
}
Public void write(Anytype x){
storedValue lue = x;
}
}
Package java.lang;
Public interface Comparable<AnyType>{
Public int compareTo(AnyType other);
}
在直接加上泛型后,可以避免类型没有转换的问题,但是限制了继承的功能,在加上通配符之后会得到一定的解决:
加上通配符的泛型:
Public static double totalArea( Collection<? Extends Shape > arr){
Double total = 0;
For( shape s : arr)
If(s != null)
Total += s.area();
Return total;
}
这样处理之后,Collection< Shape >和Collection< Square >均可以作为参数传入函数中进行运算。
加上类型界限的泛型:
public static <Anytype> AnyType findMax(Anytype[] arr){
int maxIndex = 0;
for(int I = 1; i < arr.length; i++)
if(arr[i].comparaTo( arr[maxIndex]) > 0)
maxIndex = i;
return arr[maxIndex];
}
由于不能保证Anytype已经继承了Comparable,因此编译器不能确认对compareto方法的调用是否是正确的。
更改为:
Public static <AnyType extends Comparable>…..
但是这样存在一定的局限性,比如比较图形和正方形的面积,因此应该改为:
Public static <Anytype extends Compratable<Anytype>>……
但是这样写是错误的:因为Compratable< Square > IS-NOT-A Compratable< Square >
所以代码应该改进为:
Public static <Anytype extends Compratable<? Super Anytype>>……
最后注意一点:泛型只是一种语法现象,在实现的过程中已经被具体的类型代替。两位小伙伴hammer and Gizing 有什么要补充的呢?底下评论指教指教。(说明:代码中有些大小写没有区分,因为原先在word中进行编辑了的)