一句话学习法(泛型)
泛型:
主要解决类转换异常问题,或可以将类转换异常错误从运行阶段报告提前到编译阶段报告;
所有数据类型、参数类型实质均为类;
泛型类型标识紧跟在类名称后面;
在泛型的指定中是无法指定基本数据类型的,必须设置成一个类;
装箱:将基本数据类型转换为类;
拆箱:将类转换为基本数据类型;
声明泛型类对象时如不指定类型,会出现不安全的警告信息,此时所有的类型统一使用Object进行接收;
在引用传递泛型类对象时,泛型类型必须匹配才可以传递:
1. 如被传递的类型为String,接收的类型为Object,也无法传递;
2. 接收处省略泛型,则可以传递,因为上一条的Objectt 其为狭义的Object(自己理解);
3. 接收处类型为通配符?,则可以传递(通配符的引出,因此,通配符仅出现在引用传递的接收处,包括受限泛型);
4. 如果使用?接收泛型对象时,则不能设置被泛型指定的内容,但可以设置null值;
受限泛型:(T和通配符处均可使用)
1. public static void fun (Info<? extends Number> temp){ //设置上限
System.out.print(temp + "、");
}
2. public static void fun (Info<? super String> temp){ //设置下限,只能接收String和Object类型
System.out.print("内容" + temp);
}
泛型与之类继承的限制:
Info<String> i1 = new Info<String> ;
Info<Object> i2 = null ;
i2 = i1 ;
以上编译报错,Info<String>无法转换为Info<Object>。
虽然String是Object类的子类,但在泛型操作中此概念无效,此时只能使用?接收(理解可参见引用传递);
泛型接口:
定义:
interface Info<T>{
public T getVar() ;
}
实现:
class InfoImp1<T> implements Info<T>{
......
}
实例化:
Info<String> i = null ; //定义接口对象
i = new InfoImpl<String> ("李兴华") ; //通过子类实例化此对象
或
class InfoImp1 implements Info<String>{
......
}
实例化:
Info<String> i = null ; //定义接口对象,指定泛型
i = new InfoImpl("李兴华") ; //通过子类实例化此对象,不用指定泛型
泛型接口在Java类库中大量使用,这样在使用这些接口时为防止安全警告信息的出现,都要指定具体的泛型类型
泛型方法的定义与其所在的类是否是泛型类是没有任何关系的,方法定义时返回值前的泛型标识不能少;
通过泛型方法返回泛型类实例,必须在方法的返回类型声明处明确地指定泛型标识:
public static <T extends Number> Info<T> fun(T param){
......
}
或
public static <T> Info<T> fun(T param){
......
}
等;
泛型方法与非泛型方法:
非泛型方法:
public T fun1(T param){ //T的具体类型由所在的泛型类的泛型标识的具体类型决定;
......
}
泛型方法:
public <T> T fun1(T param){ //T的具体类型由调用方法时说设置的参数类型决定;
......
}
"<T>"标识泛型的定义;"T"标识泛型的使用