解决程序参数转换问题
解决向下转型出现的安全隐患
指的是类定义的时候不会设置属性或方法参数的具体类型,而是使用时定义。
泛型类定义:
class MyClass<T> {//T:类型参数,可以指代任何引用类型(基本类型无法取代)
T value1;//T代表任意类型
}
引入泛型的作用:
1、用于检测编译期,参数类型设置问题,只有传入参数与使用定义类型一致时才可设置;
2、杜绝(取消)向下转型带来的隐患。
泛型方法:
public <T> T test(T t){
return t;
}
<T>:类型参数,不能省略,写在返回值(类型为T)之前
如果泛型类与泛型方法共存,使用同一个类型参数,【泛型类T】与【泛型方法T】没有任何联系,
泛型方法始终以自己定义的类型参数为准。
建议使用不同的标识。
通配符(3个):
?用于方法参数,指代任意类型
fun(MyClass<?> myclass):表示可以接收任意类型的MyClass对象
只能取得值(get)而不能修改(set),类型无法确定
?extends 类:设置泛型上限,【可用于类或方法参数】
?extends Number:表示只能是Number或其子类
用于方法参数时,只能取得值(get)而不能修改(set),类型无法确定
?super 类:设置类型下限,【只能用于方法参数】
?super String:表示只能设置String或其父类(Object)
用于方法参数时,可以修改值,若此时?为其父类,会默认发生向上转型,类型已确定
泛型接口
接口定义上使用此占位符表示泛型接口
子类实现接口
1、继续保留泛型
class MyClassImpl implements MyClass<T>
2、声明泛型类型
class MyClassImpl implements MyClass<String>
类型擦除
泛型信息只存在于代码编译阶段,进入JVM之前,与泛型相关的信息会被擦除掉
泛型类与普通类在JVM中没有任何区别
泛型、自动拆装箱、foreach都是Java中语法糖(方便开发者开发,,只存在于编译阶段,在运行阶段无用)
在泛型类被擦除时,之前泛型类中的参数如果没有指定上限,T->Object
若指定上限,T->类型上限