源码地址:https://github.com/ldy1993/ToolforAS.git
1、泛型介绍和使用
为什么要使用泛型,我们的接口或者抽象类,里面的方法的参数,方法的返回值,变量的修饰类型不确定且又是object的派生类
我们通常用一个符号来代替这个不确定的类。一般约定俗成如下。
- E — Element,常用在java Collection里,如:List<E>,Iterator<E>,Set<E>
- K,V — Key,Value,代表Map的键值对
- N — Number,数字
- T — Type,类型,如String,Integer等等
我们可以看到实例如下
/**
* 泛型的接口类
* @param <T>
* @param <E>
* @param <K>
* @param <V>
*/
public interface IGenerics<T,E,K,V> {
T add(E e);
void put(K key,V value);
}
/**
* 泛型的抽象类
* @param <T>
* @param <E>
* @param <V>
*/
public abstract class AGenerics<T,E,V> implements IGenerics<T,E,Integer,V> {
@Override
public T add(E e) {
return null;
}
@Override
public void put(Integer key, V value) {
}
}
/**
* 泛型的实现类
*/
public class Generics extends AGenerics<String,String,String> {
@Override
public String add(String o) {
return null;
}
@Override
public void put(Integer key, String value) {
}
}
2、通配符
通配符的意义就是它是一个未知的符号,可以是代表任意的类。用于填充T的实现类,他与T的区别在于,T是接口或者抽象类中的一个符号,而他是表示真正使用过程中要填入的值。他不可以用于实现类,而是需要用于实例化后的对象。
2.1、<? extends T> 上界通配符
上界通配符顾名思义,类似继承,<?>没有任何限制,而<? extends T>表示通配的参数化类型可能是T或T的子类。如下
代码中第一个错误,正常子类是无法通配一个父类的泛型。<? extends 父类>来表示这个泛型是类似继承父类,而可以通配这个父类的子类。
其次对于一个通配符继承了基类的类来说,他无法确定set值是哪个实现类,所以无法使用set方法
2.2、<? super T> 下界通配符
下界通配符<? super T>表示的是参数化类型是T的超类型(包含自身),层层至上,直至Object,编译器无从判断get()返回的对象的类型是什么,因此get()方法受限。但是可以进行set()方法.
如果说 <? extends XXX>指填充为派生于XXX的任意子类的话,那么<? super XXX>则表示填充为任意XXX的父类!
![](https://img-blog.csdnimg.cn/20201008102032843.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM2MzY5ODc=,size_16,color_FFFFFF,t_70)
3、Class<T>类传递
//SuccessModel.class不是泛型
public static List<SuccessModel> parseArray(String response){
List<SuccessModel> modelList = JSON.parseArray(response, SuccessModel.class);
return modelList;
}
//SuccessModel.class转化成泛型
public static <T> List<T> parseArray(String response,Class<T> object){
List<T> modelList = JSON.parseArray(response, object);
return modelList;
}
4、泛型数组
简单的代码距离说明。其中 T...代表可变参数。
/**
* 泛型的接口类
* @param <T>
* @param <E>
* @param <K>
* @param <V>
*/
public interface IGenerics<T,E,K,V> {
T[] add(E... e);
void put(K key,V value);
}
/**
* 泛型的抽象类
* @param <T>
* @param <E>
* @param <V>
*/
public abstract class AGenerics<T,E,V> implements IGenerics<T,E,Integer,V> {
@Override
public T[] add(E... e) {
return null;
}
@Override
public void put(Integer key, V value) {
}
}
/**
* 泛型的实现类
*/
public class Generics<T> extends AGenerics<String,String,String> {
private T item;
public Generics(T t){item=t;}
public void set(T t){item=t;}
public T get(){return item;}
@Override
public String[] add(String... e) {
for (String s : e) {
Log.e("tag",s);
}
return null;
}
@Override
public void put(Integer key, String value) {
}
}