泛型

泛型

1.什么是泛型

泛型是jdk5引入的类型机制,就是将类型参数化,泛型作为一种安全机制而产生泛型在本质上是指类型参数化。所谓类型参数化,是指用来声明数据的类型本身,也是可以改变的,它由实际参数来决定。在一般情况下,实际参数决定了形式参数的值。而类型参数化,则是实际参数的类型决定了形式参数的类型。

2.使用泛型的优势
1、可读性,从字面上就可以判断集合中的内容类型;
2 、类型检查,避免插入非法类型。
3 、获取数据时不在需要强制类型转换

3.泛型类
所谓泛型类generic class就是具有一个或多个类型参数的类public class 类型名<泛型名称列表>{}

publicclass Student<ID> {
private ID id;
public ID getId() {
returnthis.id;
}
publicvoid setId(ID id) {
this.id=id;
}
}

4.带两个类型参数的泛型类
如果引用多个类型,可以使用逗号分隔:<S, D>类型参数名可以使用任意字符串,建议使用有代表意义的单个字符,以便于和普通类型名区分,如:T代表type,有源数据和目的数据就用S/D,子元素类型用E等。当然,你也可以定义为XYZ,甚至xyZ。泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么类型的数据。
注意:Collection 和 Collection 是两个没有转换关系的参数化的类型

5.有界类型
public class MyClass{}表示允许 传入给T的类型必须是Nu mber类型的子类型或者Nu mber类型;
MyClass mc=new MyClass(); 语 法正确 ,因为Integer是Nu mber的子类型;
MyClass mc=new MyClass<>(); 语法错误,因为String不是Nu mber类型;
接口和类都可以用来做上界;
关键字仍然是extends而非implements。

***6.通配符参数使用***一般用于接收参数 void doSomething(Stats<?> ob) 表示这个参数ob可以是任意的Stats类型。其中?表示一 个 不确定 的 类 型 , 它 的 值会在调用 时确定 下 来 。 List<?> list = newArrayList();

7.泛型的局限性
不能使用基本类型;
不能使用泛型类异常;
不能使用泛型数组。

8.定义泛型类

public class <T,ID>{
private ID id;
private T name;
}

定义泛型接口

public interface IA<T>{
public Tpp();
}

泛型类上的泛型约束

public class MyClass<T extends IA>
{}

如果泛型实现两个或两个以上的接口

public class MyClass<T extends 接口1 & 接口2>{}

如果要求泛型继承一个类并且实现一个接口

public class MyClass<T extends 类型 & 接口>{}

在泛型或者泛型接口中不允许使用super

//这里可以认为Integer是Integer的父类
List<? super Integer> array = new ArrayList<Integer>();
//Number 是Integer 的父类
List<? super Integer> array = new ArrayList<Number>();
//Object 是Integer的父类
List<? super Integer> array = new ArrayList<Object>();
上一篇:实例开发-一键设置透明度工具


下一篇:022-Python入门(函数参数详解)