我是靠谱客的博主 爱听歌老虎,这篇文章主要介绍Java学习笔记:利用泛型动态的返回不同的类环境前言动态的返回不同的类? 和 T 的区别,现在分享给大家,希望可以做个参考。

环境

前言

最近在做代码迁移时,想写这么一个方法,我传入什么对象,其就返回什么对象;
传入的对象有继承关系,在处理完相应逻辑后,就返回该对象;

比如有如下两个类:

复制代码
1
2
3
ExaminationBindBO |___________ExaminationPkgBindBO

我希望我得到的效果是:

复制代码
1
2
3
4
5
ExaminationPkgBindBO 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
5
public <T extends ExaminationBindBO> T saveProductChannel(List<T> request) { // 处理业务逻辑 return request.get(0); }

如果想更动态的返回

复制代码
1
2
3
4
5
6
7
8
9
10
public <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学习笔记:利用泛型动态的返回不同的类环境前言动态的返回不同的类?内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部