Android 在日常中经常使用的 List<E>, ArrayList<E> 是我们接触最多的泛型类。 清楚什么是泛型,怎么定义泛型可以帮助我们更好的理解系统中提供的泛型类的结构和用途。
User.java
/**
*
* 自定义泛型类:
* 1,继承的自定义泛型类可以指定泛型类型, 那子类就不再是泛型类了 见 SZUser
* 2,继承的自定义泛型类也可以不指定类型,继续保持泛型, 见GZUser
* 3,异常类不能是泛型类
* 4,泛型类实例化时,若没有指定类型,默认使用Object
*
*
* 泛型方法:
* 1,在方法中出现泛型结构,泛型参数与类的泛型参数没有任何关系。也就是说泛型方法所属的类是不是泛型类都没有关系。
* 2,泛型方法在调用时,指明泛型参数的类型
* 3, 静态方法不可以使用类的泛型
*
* @description
*/
public class User<T> {
String name;
int id;
T orderType;
public User(String userName, int id, T orderType) {
this.name = userName;
this.id = id;
this.orderType = orderType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//自定义泛型方法
public <E> List<E> copyFromArrayToList(E[] arr) {
ArrayList<E> list = new ArrayList<>();
for (E e: arr) {
list.add(e);
}
return list;
}
// 如下的3个方法都不是泛型方法
public T getOrderType() {
return orderType;
}
public void setOrderType(T orderType) {
this.orderType = orderType;
}
@NonNull
@Override
public String toString() {
return "{name = " + name + ", id = " + id + ", orderType = " + orderType.toString() + "}";
}
}
SZUser.java
public class SZUser extends User<Integer> {
public SZUser(String userName, int id, Integer orderType) {
super(userName, id, orderType);
}
}
GZUser.java
public class GZUser<T> extends User<T> {
public GZUser(String userName, int id, T orderType) {
super(userName, id, orderType);
}
}
自定义泛型接口和自定义泛型类基本类似:
Show.java
public interface Show<T, U> {
void show(T t, U u);
}
ShowTest.java
public class ShowTest implements Show<String, Integer> {
@Override
public void show(String s, Integer integer) {
// testPrint("---------")
}
}
上面自定义的泛型中,没有对泛型<T>有任何的限制。在实际的开发过程中,有很多的场景需要对泛型进行一定的限制。 具体见如下demo:
Utils.java
public class Utils {
public static <E extends Comparable> int compareTo(E e1, E e2) {
return e1.compareTo(e2);
}
public static <E extends SuperActivity & Comparable & Serializable> int compareTo(E e1, E e2) {
return e1.compareTo(e2);
}
}
tips:
类型限定在泛型类、泛型接口和泛型方法中都可以使用,不过要注意下面几点:
public void test() {
//声明
List<?> list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<Object>();
Object o = list.get(0); //编译通过
list.add(new A()); //编译不通过
list.add(new B()); //编译不通过
list.add(new C()); //编译不通过
list.add(new D()); //编译不通过
test(list);
}
public static void test(List<?> list){
}
tips: