从JDK5之后才开始引入了泛型,java泛型与c++中的模板相似。
注意事项:
1)泛型只能用于对象
例如:
class Demo<T>{ }
Demo<Integer> iOb = newDemo<Integer>(10);////正确
Demo<int> iOb = newDemo<int>(10);//错误,因为int是基本类型;
在JDK7之后,简化了泛型的实例化过程;
例如:Demo<Integer> iOb = newDemo<>(10);////这样也是正确的;
如果需要限制泛型所能支持的类型,使用约束类型。即让泛型继承一个父类;
例如:
class Demo<T extends Number>{ } //这个泛型限制在Number类型下的类型范围;
3)通配符作用
要创建一个泛型的absEqual()方法,必须使用java的另一个泛型特性:通配符实参。由“?”指定,代表未知的类型。
例如:
class Demo<T extends Number>{
T num;
booleanabsEqual(num.(Demo<T> ob){
if(Math.abs(num.doubleValue()) == Math.abs(ob.num.doubleValue()))
return true;
return false;
}
}/////////////////会出现编译错误
class Demo<T>{
T num;
booleanabsEqual(num.(Demo<?> ob){
if(Math.abs(num.doubleValue()) == Math.abs(ob.num.doubleValue()))
return true;
return false;
}
}/////////////////编译正确
通配符也像约束类型一下,进行相应的类型限制;例如:
booleanabsEqual(num.(Demo<?extends A> ob) //其中A为某一类型;
4)任何实现泛型接口的类也必须是泛型的
5)擦除特性
当java代码编译时,所有的泛型类型信息都将被删除(擦除)。这意味着使用类型形参的约束类型来替换类型形参,如果没有显示的指定约束类型,则约束类型为Object,然后应用合适的强制类型转换(由类型实参确定)来与类型实参指定的类型保持兼容。编译器还强制这种类型兼容性。这种方法对于泛型意味着在运行时不存在类型形参,它们只是一种源代码机制。(参考:《新手学习java7编程》)