【每周至少一篇 160811(上周补传)】泛型_Java
2016-08-11 18:26
375 查看
为了生存,代码大跃进。首先自己谴责自己一下:第一次破坏制度,漏传博客,感谢hammer的提醒,习惯一定要坚持。以后请Gizing和Hammer两位小伙伴多多监督。
高级语言与低级语言相比,其重点处理的地方是隐藏好与机器相关的部分,使得语言尽可能地与自然语言相一致。JAVA泛型解决的问题主要是减少程序中的类型转换代码,同时规范由于继承关系产生的运行错误。
类型转换的例子是:
如果没有自动装箱/拆箱等,类型转换必须书写
继承关系的例子是:
上面两个语句在编译时,完全没有语法错误,因为student IS A person。但是运行时,JVM会抛出ClassCastException,因为没有进行类型转换,用arr[0]调用Employee方法是不合理的。
简单的介绍泛型:
最基础的泛型版本:
在直接加上泛型后,可以避免类型没有转换的问题,但是限制了继承的功能,在加上通配符之后会得到一定的解决:
加上通配符的泛型:
这样处理之后,Collection< Shape >和Collection< Square >均可以作为参数传入函数中进行运算。
加上类型界限的泛型:
由于不能保证Anytype已经继承了Comparable,因此编译器不能确认对compareto方法的调用是否是正确的。
更改为:
但是这样存在一定的局限性,比如比较图形和正方形的面积,因此应该改为:
但是这样写是错误的:因为Compratable< Square > IS-NOT-A Compratable< Square >
所以代码应该改进为:
最后注意一点:泛型只是一种语法现象,在实现的过程中已经被具体的类型代替。两位小伙伴hammer and Gizing 有什么要补充的呢?底下评论指教指教。(说明:代码中有些大小写没有区分,因为原先在word中进行编辑了的)
高级语言与低级语言相比,其重点处理的地方是隐藏好与机器相关的部分,使得语言尽可能地与自然语言相一致。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中进行编辑了的)
相关文章推荐
- 【每周至少一篇 160811】函数对象_Java
- 【每周至少一篇 160819】最大子序列和问题的四种求法_Java
- 【每周至少一篇 160727】简单的选择问题(select problem)_Java
- 2013年新的开始,每周至少要写一篇博客!
- 2013年新的开始,每周至少要写一篇博客!
- 一篇讲Java的泛型讲的很详细的文章
- 新博客 每周至少更新一篇 欢迎大家前来指教
- 【每周至少一篇 160901】循环级别的代码优化(上周补充)
- 2013年新的开始,每周至少要写一篇博客!
- 一篇关于java泛型的详细讲解
- java 泛型(一篇很不错的文章)
- 从今天开始,每周至少一篇博客吧
- 【每周至少一篇 160901】语句级别的代码优化
- 一篇不错的讲解Java异常的文章
- [转]Anders Hejlsberg谈C#、Java和C++中的泛型
- Java下的Framework编写(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)(1)--序
- 一篇不错的介绍Java Socket编程的文章
- (收藏)Anders Hejlsberg谈C#、Java和C++中的泛型
- J2SE:JAVA泛型
- 对我很有帮助的一篇关于“扩展 Eclipse 的 Java 开发工具”的文章