Android 进阶之学好Java
Java作为Android系统开发的基础,目前系统SDK还是使用Java语言,很多第三方库也是使用Java写的;Kotlin也需要编译成Java运行,Java在后台开发中也是一种非常流行的语言,所以Java知识还是要牢牢掌握的。
Java中的泛型
1.为什么需要使用泛型
- 使用泛型可以在编译期间对类型检测,避免类型转换异常
- 不需要强制类型转换
- 代码复用
2.泛型定义的对象
- 泛型类
- 泛型方法
- 泛型接口
3.泛型的使用:
/**
* 泛型类
* @param <T>
*/
public class GenericityTest<T> {
private T key;
/**
* 普通方法,泛型在创建类的对象时已经创建
* @param t
*/
public void routineGenerivity(T t) {
this.key = t;
}
/**
* 泛型方法
*
* @param <V>
*/
public <V> V geericityMethod(List<V> list) {
V v = null;
if (list != null && list.size() > 0) {
v = list.get(0);
}
return v;
}
/**
* 泛型接口
* @param <K>
*/
interface GenericityInterface<K>{
}
}
4.限定类型变量
有时候我们需要对类型变量加以约束,确保泛型传递的是我们需要的参数;比如:
public <K extends Comparable<K>> K compare(K a, K b) {
if (a.compareTo(b) > 0) {
return a;
} else {
return b;
}
}
K表示应该绑定的子类型,Comparable表示绑定类型;绑定类型可以是类,也可以是接口。extends左右都允许有多个。如 T,V extends Comparable & Serializable;只允许有一个类,而且如果有类,这个类必须是限定列表的第一个。
5.泛型中的约束和局限性
- 不能用基本数据类型实例化类型参数;如:
List list=new ArrayList<>(); - 静态域或者静态方法域不能引用泛型实例,静态方法本身是泛型方法可以
- 创建数组时不能参数化,声明时可以
- 不能实例化泛型变量
- 不能捕捉泛型类的实例
- 泛型类可以继承或者扩展其他泛型类,比如List和ArrayList
6.通配符泛型
- ? extends X:类型的上限,类型参数必须是X的子类,包括X本身;当使用上限通配符时,可以调用获取数据的get方法,不允许调用set数据方法。? extends X 表示类型的上界,类型参数是X的子类,那么可以肯定的说,get方法返回的一定是个X(不管是X或者X的子类)编译器是可以确定知道的。但是set方法只知道传入的是个X,至于具体是X的那个子类,不知道。
- ? extends X:类型的下限,类型参数必须是X的超类,包括X本身;可以调用写入数据的set方法,不能调用获取数据的get方法
- ?:无限定通配符;表示对类型没有什么限制,可以把?看成所有类型的父类