环境
前言
最近在做代码迁移时,想写这么一个方法,我传入什么对象,其就返回什么对象;
传入的对象有继承关系,在处理完相应逻辑后,就返回该对象;
比如有如下两个类:
1
2
3ExaminationBindBO |___________ExaminationPkgBindBO
我希望我得到的效果是:
1
2
3
4
5ExaminationPkgBindBO pkgBindBO = new ExaminationPkgBindBO(); ExaminationBindBO bindBO = new ExaminationBindBO(); ExaminationPkgBindBO bindBO = saveProductChannel(Lists.newArrayList(pkgBindBO)); ExaminationBindBO bindBO = saveProductChannel(Lists.newArrayList(bindBO));
关键saveProductChannel()
这个方法怎么写?
一开始时间紧,没想出来,只写成了返回值为void的方法;
1
2
3
4
5// 上界通配符 public void saveProductChannel(List<? extends ExaminationBindBO> request) { // 处理业务逻辑 }
后面闲下来又研究了下;
动态的返回不同的类
1
2
3
4
5public <T extends ExaminationBindBO> T saveProductChannel(List<T> request) { // 处理业务逻辑 return request.get(0); }
如果想更动态的返回:
1
2
3
4
5
6
7
8
9
10public <T> List<T> saveProductChannel(Class<List<T>> request) { List<T> t = null; try { t = request.getDeclaredConstructor().newInstance(); } catch (Exception e) { e.printStackTrace(); } return t; }
后面在查阅资料中有了个疑问:
为什么方法参数中上界通配符
只能写成这样<? extends ExaminationBindBO>
而不能写成<T extends ExaminationBindBO>
拿上面例子举例:
1
2
3
4
5// 正确 public void saveProductChannel(List<? extends ExaminationBindBO> request) {} // 会报错 public void saveProductChannel(List<T extends ExaminationBindBO> request) {}
我可以理解为:没有声明T是哪里的,所以我尝试这么写:
1
2
3// 会报错 public <T> void saveProductChannel(List<T extends ExaminationBindBO> request) {}
又报错了,我的理解:虽然在public和void之间定义了T
,而方法参数中的<T extends ExaminationBindBO>
是在使用T,并不能定义T,所以它报错了;
按照这样理解,那么我就到定义T的地方去写上界通配符
:
1
2
3
4
5// 正确 public <T extends ExaminationBindBO> void saveProductChannel3(List<T> request) { T t = request.get(0); }
这时我又思考:为什么在方法参数中<? extends ExaminationBindBO>
不报错,而<T extends ExaminationBindBO>
报错呢?
个人理解:
虽然?和T都表示不确定类型,但是T 是不确定中的确定类型,即要求你定义T是哪来的~
也就是方法 public和返回值 之间得写,这就是在定义,那么其继续关系自然就得在定义处来写了;
而<? extends ExaminationBindBO>中的?
是不需要你定义哪来的,是真正的不确定类型,随便你哪来的都可以。
? 和 T 的区别
这两个都是不确定的通配符,其中?
又叫无界通配符
。在使用时,不需要定义?
;
而T
表示具体某个类型。在使用时,是需要定义T的;并且在代码中,可以对T进行操作,而?没办法操作。
应用场景
T
是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?
是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。
不知道你会有觉得上面一会确定 一会不确定 这种描述感到困惑;
虽然?和T都是不确定通配符,但是在不确定的问题中,还是有确认的东西的。----- 我自己的理解
参考地址:
https://juejin.im/post/6844903917835419661
在java的泛型中super和extends的区别
最后
以上就是爱听歌老虎最近收集整理的关于Java学习笔记:利用泛型动态的返回不同的类环境前言动态的返回不同的类? 和 T 的区别的全部内容,更多相关Java学习笔记:利用泛型动态的返回不同的类环境前言动态的返回不同的类?内容请搜索靠谱客的其他文章。
发表评论 取消回复