关于 Type接口和ParameterizedType接口之间强转的疑问~!!

iskaol 2017-10-28 11:21:43
看一个GenricDaoImpl代码时候存在一个疑问:

public class GenricDaoImpl<T extends Serializable, PK extends Serializable>
implements GenricDao<T, PK> {

private Class<?> entityClass; // 实体类的类型

public GenricDaoImpl() {
entityClass = (Class<?>)((ParameterizedType) (this.getClass()
.getGenericSuperclass())).getActualTypeArguments()[0];
}
}

Type type = this.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType)type;

其中ParameterizedType接口是Type的子接口,Class类是Type实现类;

但是Class类并没有实现ParameterizedType接口,强转为什么没有报错;

Class类也没有重写getActualTypeArguments()方法;

我自写了一个类似的Demo,报了com.itany.C cannot be cast to com.itany.B,代码如下:
interface A{}
interface B extends A{}
class C implements A{}
public class Main {
public static void main(String[] args) {
A a= new C();
B b=(B)a;
}
}
...全文
827 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-06-08
  • 打赏
  • 举报
回复
卧槽。楼主,你连类的关系模型都没弄明白,还是先别考虑泛型的问题了。 泛型和继承是两个概念的东西。 implements 和 extends 也是有区别的。 楼主那个报错,不是泛型的问题,是继承的问题。 你的那个C类,没有继承B接口,只继承了A接口,你将C强制转换成B接口,肯定是要报错的。
qybao 2020-06-03
  • 打赏
  • 举报
回复
很多东西不能只看表面,返回值是接口的实现类,这个实现类同时还实现了什么接口,你要查清楚,没有规定返回的接口实现类不能同时实现其它接口
iskaol 2020-06-03
  • 打赏
  • 举报
回复
引用 4 楼 maradona1984 的回复:
[quote=引用 2 楼 iskaol 的回复:] [quote=引用 1 楼 pany1209 的回复:] 先看看多态。。。。
恩?多态? 关键是Class类 和ParameterizedType 接口之间并没有关系[/quote] A类和B接口是没关系,但C类和A类有关系,也与B接口有关系,你的问题是把C类当作A类看了,所以才会纠结A与B的关系,但实际上并不是你想的那样,你那个方法得到的对象是C类型,虽然不知道具体什么类,但应该继承了A类,实现了B接口 ABC你自己对号入座[/quote] 感谢!当时刚开始学习看不得仔细
maradona1984 2017-10-30
  • 打赏
  • 举报
回复
引用 2 楼 iskaol 的回复:
[quote=引用 1 楼 pany1209 的回复:] 先看看多态。。。。
恩?多态? 关键是Class类 和ParameterizedType 接口之间并没有关系[/quote] A类和B接口是没关系,但C类和A类有关系,也与B接口有关系,你的问题是把C类当作A类看了,所以才会纠结A与B的关系,但实际上并不是你想的那样,你那个方法得到的对象是C类型,虽然不知道具体什么类,但应该继承了A类,实现了B接口 ABC你自己对号入座
李德胜1995 2017-10-29
  • 打赏
  • 举报
回复
引用 2 楼 iskaol 的回复:
[quote=引用 1 楼 pany1209 的回复:] 先看看多态。。。。
恩?多态? 关键是Class类 和ParameterizedType 接口之间并没有关系[/quote] Type type = this.getClass().getGenericSuperclass(); type是ParameterizedType的实现类ParameterizedTypeImpl不是Class....
iskaol 2017-10-29
  • 打赏
  • 举报
回复
引用 1 楼 pany1209 的回复:
先看看多态。。。。
恩?多态? 关键是Class类 和ParameterizedType 接口之间并没有关系
李德胜1995 2017-10-29
  • 打赏
  • 举报
回复
先看看多态。。。。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧