阅读本文大概需要 5 分钟。
作者:的一幕
https://www.jianshu.com/p/dd34211f2565
这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下:
T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
<span style="max-width: 100%; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">extends</span>
,对于泛型写得多的伙伴们来说,<span style="max-width: 100%; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">extends</span>
是约束了泛型是向下继承的,最后我们通过反射获取value的类型是String类型的,因此这里也不难看出,加<span style="max-width: 100%; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">extends</span>
关键字其实最终目的是约束泛型是属于哪一类的。所以我们在编写代码的时候如果没有向下兼容类型,会警告错误的:常见的泛型主要有作用在普通类上面,作用在抽象类、接口、静态或非静态方法上。
比如实际项目中,我们经常会遇到服务端返回的接口中都有 <span style="max-width: 100%; font-size: 16px; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">errMsg</span>
、<span style="max-width: 100%; font-size: 16px; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">status</span>
等公共返回信息,而变动的数据结构是data信息,因此我们可以抽取公共的<span style="max-width: 100%; font-size: 16px; letter-spacing: 1px; color: #000000; box-sizing: border-box !important; overflow-wrap: break-word !important;">BaseBean</span>
:
public String errMsg;
public T data;
public int status;
}
public abstract class BaseAdapter<T> {
List<T> DATAS;}//接口泛型public interface Factory<T> {
T create();
}
//方法泛型
public static <T> T getData() {
return null;
}
void setKey(K k);
V getValue();}
}
//或抽象类
public abstract class BaseCommon<K extends Common1, V>
implements Base<K, V> {
}
// void setKey(K k);//// V getValue();
void addNode(Map<K, V> map);
Map<K, V> getNode(int index);}public abstract class BaseCommon<K, V> implements Base<K, V> {
//多重泛型
LinkedList<Map<K, V>> DATAS = new LinkedList<>();
@Override
public void addNode(Map<K, V> map) {
DATAS.addLast(map);
}
@Override
public Map<K, V> getNode(int index) {
return DATAS.get(index);
}
}
<?>通配符
和<T>
区别是在你不知道泛型类型的时候,可以用通配符来定义,下面通过一个例子来看看的用处:public class BaseBean<T> {
T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
//用来定义泛型的
public class Common1 extends Common {
}
BaseBean<Common> commonBaseBean = new BaseBean<>();
//通配符定义就没有问题
BaseBean<?> common1BaseBean = commonBaseBean;
try {
//通过反射猜测setValue的参数是Object类型的
Method setValue = common1BaseBean.getClass().getDeclaredMethod(“setValue”, Object.class);
setValue.invoke(common1BaseBean, “123”);
Object value = common1BaseBean.getValue();
System.out.println(“result:” + value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
关注公众号「程序员的成长之路」后回复「2048」关键字,免费获取5T技术学习资源!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。
//todo
}
<T extends>表示上限泛型、<T super>表示下限泛型
BaseCommonpublic class Common extends BaseCommon{}
在实际开发中其实知道什么时候定义什么类型的泛型就ok,在mvp实际案例中泛型用得比较广泛,大家可以根据实际项目来找找泛型的感觉,只是面试的时候需要理解类型擦除是针对谁而言的。关注微信公众号:互联网架构师,获取更多架构技术干货。
推荐阅读:
新特性:这招牛逼,Spring Boot 2.3.0 如何优雅停机?
微信扫描二维码,关注我的公众号
朕已阅
文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/1099.html