Java高级特性 2
6.泛型:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);
例子:
a..使用?通配符可以引用其他各种参数化的类型,但不能调用与参数化有关的方法;
Collection<?> c = new Vector<String>();
c.add("abc");//报错
c.size();//正确
所以,?通配符定义的变量主要用作引用,调用与参数化无关的方法,如果要调用与参数化相关的方法,那么必须在使用?通配符引用之前调用,否则就与java 5提供泛型的目的背道而驰了。
b..向下限定通配符:
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
向上限定通配符:
正确:Vector<? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
jdk中原有的集合类中存在一些问题,java5以后希望你在定义集合时,明确表示你要向集合中装哪种类型的数据。为了和以前版本的兼容性,无法加入指定类型以外的数据,编译器会去除掉“类型”信息,使运行效率不受影响。在新语法情况,还可以把各种不同类型的数据装到一个集合中,可以按原始的方式去做。ArrayList<E>中的E是类型变量,参数化的类型(整个ArrayList<Integer>,即进行了参数化的类型),原始类型(也就是ArrayList),类型参数(ArrayList<Integer>中的Integer),以上几个术语应该牢记。参数化类型引用一个原始类型的对象,可以,但是报告警告。原始类型引用一个参数化类型的对象,可以,也会报告警告。有时候定义一个方法,打印一个集合中的数据,集合的类型变量该使用?通配符进行参数化。切忌不可以使用Object,如果使用了Object,则这个类型只能匹配Object类型的变量。例如:Vec
相关文档:
看到园子的同僚们写的《跨平台》系列之后真的是热血沸腾,有些话不得不说,不能不说。我要揭掉Java这一层层美丽的“画皮”,让大家看看画皮之下是什么?我们看到的都是一些什么?我本人并不是一定得推荐大家用.NET平台,但是我就是看不管有些人误导初学者,向他们传导什么都 ......
【IT168 文档
】内存
泄露问题对于程序来说,是一个很难发现,并且容易引起严重灾害的事情。
Java一直以其垃圾回收机制为自豪,那是否这种机制就是完美的呢。
常规理解上,Java的内存
管理机制是将局部变量保存在堆中,当变量的作用域结束之后,该变量所占用的
内容会被自动回收。不需要做任何特殊的处理。比如下 ......
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经 ......
本文为原创,如需转载,请注明作者和出处,谢谢!
缩放图像的基本原理是创建一个目标大小的画布,然后读取源图像,并将该图像绘制这个画布上。为了使程序通用,源图像和缩放后的目标图像应用分别使用
InputStream和OutputStream来表示,代码如下:
public
stat ......