泛型通配符的一些疑惑?

lee110 2017-08-30 04:13:53
如下代码:
Demo<? super A> a = new Demo<C>();
a.setT(new B());//a.setT(new C())报错;
B b = (B)a.getT();
System.out.println(b);
class A extends C{
public String toString(){
return "aaaaaaaaaaa";
}
}
class B extends A{
public String toString(){
return "bbbbbbbbb";
}

}

class C {
public String toString(){
return "cccccccccccc";
}
}
class Demo<T >{
private T t;
public Demo(){
t= null;
}
public Demo(T t){
this.t = t;
}
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}

C是父类,A是C的子类,B是A的子类。
本人感到疑惑的是:1.书上说? super A 是不能用get方法的。但此处编译正常也能正常运行。
2.set方法中放入new B(),new A() 都正常,但无法放入new C()请问这如何解释?
jdk为1.8
谢谢大家了!
...全文
180 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40018343 2017-08-31
  • 打赏
  • 举报
回复
引用 2 楼 lee110的回复:
谢谢了,那请问? super A 是不能用get方法的,但调用get方法也没有报错也可以正常运行,是什么原因呢? 谢谢!
要set到a或a的父类 get没影响 那老哥说的没毛病
soton_dolphin 2017-08-30
  • 打赏
  • 举报
回复
引用 2 楼 lee110 的回复:
谢谢了,那请问? super A 是不能用get方法的,但调用get方法也没有报错也可以正常运行,是什么原因呢? 谢谢!
哪里说不能调用getT 方法了??
lee110 2017-08-30
  • 打赏
  • 举报
回复
谢谢了,那请问? super A 是不能用get方法的,但调用get方法也没有报错也可以正常运行,是什么原因呢? 谢谢!
soton_dolphin 2017-08-30
  • 打赏
  • 举报
回复
Demo<? super A> a = new Demo<C>(); 这一句的意思是可以 变量 a 可以接受Demo 的泛型为A或者A的父类。 但是在调用setT的时候,编译器必须确认传入的参数是A或者A的子类,才能保证不会发生ClassCastException。如果你用一个比较清晰地类就能知道编译器为什么报错了。 Demo<? super Integer> number = new Demo<Number>(); // number变量 可以指向Integer 或者它父类的引用。 number.setT(new Double("3.4")); //编译错误, setT 必须接受Integer 或者它的子类, 如果setT接受Double类,那DEMO的值就乱套了 number.setT(new Integer(3));

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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