泛型
泛型本质是参数化类型,也就是说操作的数据类型被指定为一个参数。
这就是参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法
所谓泛型:就是指在类创建时不指定类中属性的具体类型,而由外部在声明及实例化对象时指定类型
为什么要用泛型
-
类型安全
泛型的主要目的时提高Java程序的类型安全。编译时强类型检查;
使用泛型编写的程序代码,要比使用 Object 变量再进行强制类型转换的代码,具有更好的安全性和可读性。
多种数据类型执行相同的代码使用泛型可以复用代码。
-
消除强制类型转换
泛型的附带好处是消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错的机会
-
潜在的性能收益
泛型为较大的优化带来可能
参数化类型
ArrayList 占位符
通配符 ?
上下限
?exends people 上限
?super people 下限
泛型使用
泛型类
public class FX<A,B,C>{
private A name;
private B age;
private C sex;
public FX(){
}
public FX(A name,B age, C sex){
this.name=name;
this.age=age;
this.sex=sex;
}
get
set
toString
}
泛型就是自定义的数据类型,当使用当前泛型实体类时,自己设置数据类型,默认都为Object
泛型方法
public class FX(){
public void test(){
}
//泛型方法
public <E> void test1(E e){
System.out.println(e);
}
//静态泛型方法
public static <E> void test2(E e){
System.out.plintln(e)
}
}
泛型接口
public interface FXFace<E>{
void test(E e);
}
实现泛型接口
实现泛型接口时要先定义泛型类型,否则默认Object
public class FX implements FXFace<String>{
void test(String e){
System.out.println(e)
}
}
泛型的继承关系以及上下限通配符
泛型通配符”?“任何的参数类型都可以赋给它
class People{}//父类
class People1 extends People{}继承people
class people2 extends People1{}继承people1
//?只能是people和people的父类,子类不行此为下限
List<? extends People>
//?只能是people和people的子类,父类不行,此为上限
List<? super People>
泛型擦除
如果将一个具备泛型的对象赋值给不具备泛型的对象,那么泛型丢失。
ArrayList<People> peoples = new ArrayList<>();
List p = peoples;
Object o = p.get(0);
将具有泛型的Peoples赋值给没有具体泛型的的p,此时我们从p中取值,发现本来peoples具有的泛型,现在么得了。