JAVA泛型相关的问题,可能比较乱,我下面详细说
先上图我先解释一下,A,B两个类继承于C,C继承于D,都重写了TOString。其它的接口,方法就不要看了与问题无关,TestExtends类泛型上限为C,定义了一个形参...
先上图
我先解释一下,A,B两个类继承于C,C继承于D,都重写了TOString。其它的接口,方法就不要看了与问题无关,TestExtends类泛型上限为C,定义了一个形参泛型下限为C的test方法,最后一个测试类TestTest里面声明了一个类型参数为B的TestExtends实例bb,声明了一个类型参数为C的Arraylist实例cc,并加入集合中一个C的实例。随后调用 了bb.test(cc)方法,然后再看方法里面,方法里面的局部变量b是T类型的,也就是B类型的,它获得了new C()的值,并试着强制转换,结果问题出现了,按理说,应该运行报错的,C的实例不可能转换成他的子类型B的实例,但运行的时候没有报错,而且,通过下面一行b.getClass()得到的是C.class。就好像跟本没有强制转换一样,之后b的值被return给了D d,正常输出,但如果把d声明改成B,又会出现错误,这证明,return出来的是C类型,为什么会这样呢? 展开
我先解释一下,A,B两个类继承于C,C继承于D,都重写了TOString。其它的接口,方法就不要看了与问题无关,TestExtends类泛型上限为C,定义了一个形参泛型下限为C的test方法,最后一个测试类TestTest里面声明了一个类型参数为B的TestExtends实例bb,声明了一个类型参数为C的Arraylist实例cc,并加入集合中一个C的实例。随后调用 了bb.test(cc)方法,然后再看方法里面,方法里面的局部变量b是T类型的,也就是B类型的,它获得了new C()的值,并试着强制转换,结果问题出现了,按理说,应该运行报错的,C的实例不可能转换成他的子类型B的实例,但运行的时候没有报错,而且,通过下面一行b.getClass()得到的是C.class。就好像跟本没有强制转换一样,之后b的值被return给了D d,正常输出,但如果把d声明改成B,又会出现错误,这证明,return出来的是C类型,为什么会这样呢? 展开
1个回答
展开全部
继承的关系没搞明白。
问题:你的bb.test(cc)方法,在泛型里传入的是C对象的集合list;那么T b = (T)list.get(0)得到的就是一个C对象。现在return的也是C对象;那么为什么接收的是D d = bb.test(cc)没报错,是因为你的C继承于D,D是A B C的公共父类,典型的父类引用指向子类对象,肯定不会报错(打个比方,狗(C)是动物,那么定义一个动物(D),可以赋值为狗(C),那么,反过来,老鼠(B)也是动物,也继承动物(D),也可以赋值于动物(D),但是虽然同是动物,肯定不能把老鼠(B)等同狗(C)了;所以B d = bb.test(cc)肯定错误了。
希望对你有帮助!
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询