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

环境

前言

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

比如有如下两个类:

ExaminationBindBO
|___________ExaminationPkgBindBO

我希望我得到的效果是:

ExaminationPkgBindBO pkgBindBO = new ExaminationPkgBindBO();
ExaminationBindBO bindBO = new ExaminationBindBO();
ExaminationPkgBindBO bindBO = saveProductChannel(Lists.newArrayList(pkgBindBO));
ExaminationBindBO bindBO = saveProductChannel(Lists.newArrayList(bindBO));

关键saveProductChannel()这个方法怎么写?
一开始时间紧,没想出来,只写成了返回值为void的方法;

// 上界通配符
public void saveProductChannel(List<? extends ExaminationBindBO> request) {
// 处理业务逻辑
}

后面闲下来又研究了下;

动态的返回不同的类

public <T extends ExaminationBindBO> T saveProductChannel(List<T> request) {
// 处理业务逻辑
return request.get(0);
}

如果想更动态的返回

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>
拿上面例子举例:

// 正确
public void saveProductChannel(List<? extends ExaminationBindBO> request) {}
// 会报错
public void saveProductChannel(List<T extends ExaminationBindBO> request) {}

我可以理解为:没有声明T是哪里的,所以我尝试这么写:

// 会报错
public <T> void saveProductChannel(List<T extends ExaminationBindBO> request) {}

又报错了,我的理解:虽然在public和void之间定义了T,而方法参数中的<T extends ExaminationBindBO>是在使用T,并不能定义T,所以它报错了;
按照这样理解,那么我就到定义T的地方去写上界通配符

// 正确
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学习笔记:利用泛型动态的返回不同的类环境前言动态的返回不同的类?内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部