请看:
public class Demo6 { public static void main(String[] args) {
// TODO 自动生成的方法存根
Message<String> obj=new Message<String>();
obj.setMsg("Hello World!");
fun(obj);
Message<Integer> obj1=new Message<Integer>();
obj1.setMsg(123);
fun(obj1);
}
public static void fun(Message<?> msg){
System.out.println("Message="+msg.getMsg());
}}class Message<T>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return this.msg;
}
}
这个是可以运行的,现在我把方法fun参数改为fun(Message msg)也是可以的,
但是如果改为fun(Message<Object> msg)就不可以了。
我有个问题:不是说泛型中如果不加<类型>就表示<Object>吗?
为什么我这里fun方法不加<类型>可以运行,而加了<Object>反而不行呢?
public class Demo6 { public static void main(String[] args) {
// TODO 自动生成的方法存根
Message<String> obj=new Message<String>();
obj.setMsg("Hello World!");
fun(obj);
Message<Integer> obj1=new Message<Integer>();
obj1.setMsg(123);
fun(obj1);
}
public static void fun(Message<?> msg){
System.out.println("Message="+msg.getMsg());
}}class Message<T>{
private T msg;
public void setMsg(T msg){
this.msg=msg;
}
public T getMsg(){
return this.msg;
}
}
这个是可以运行的,现在我把方法fun参数改为fun(Message msg)也是可以的,
但是如果改为fun(Message<Object> msg)就不可以了。
我有个问题:不是说泛型中如果不加<类型>就表示<Object>吗?
为什么我这里fun方法不加<类型>可以运行,而加了<Object>反而不行呢?
解决方案 »
- 一个java的小问题,刚刚学java不久,问的问题可能有点白痴,各位帮帮忙
- 在java里,一个类可不可以同时继承父类、实现接口。
- 跪求一篇计算机网络课程设计
- 弹出对话框为什么切换界面时会掩藏到主画面后
- [转贴]绝好的日期控件(My97DatePicker2.0)正式版发布(跨浏览器,跨框架,支持时间选择,自定义格式,动态切换皮肤等等),顶上去大家一起分享啊
- 学JAVA用什么书好?给个建议!
- 我怎么没有在CHM API HELP帮助文件中找到关于switch语句的介绍呢,
- JAVA如何区分哪个是半角哪个是全角,两者如何转换.
- 如何把一个CLASS文件名当做一个参数进行传递,最后并打开此文件?
- 大家帮帮忙啊,高分!
- 请问个泛型的问题
- 主线程与子线程如何进行消息通信?
要么你就还是原来的Message<?> msg //任意类型,要么你就Message<? extends Object> msg //其实跟任意类型一样
不加泛型和Message<Object>并不等价,不加泛型会编译警告,类型转换安全要自己控制,加了泛型,类型不一致会编译通不过
你改成Message<Object> msg,你传的参数是Message<String> obj,Message<Integer> obj1,泛型不匹配
===================
可是String、Integer的父类都是Object,为什么说类型不匹配?2、不加泛型时,传的参数是Message<String> obj,Message<Integer> obj1,它们如何与 Message msg进行匹配?
也就是说在传递时它们如何进行对应?(实参如何与虚参对应)
A有个私有方法a,AA继承A
你有个的集合<A>,里面存放AA
for (A a : 集合) {
a.a(); //因为集合存放的子类AA,子类不能访问A的私有方法,所以此处会运行期出错
}
为了解决上面的问题,泛型规定集合<A>不能存放子类AA,也就是编译器会出错
如果想存放子类,就用集合<? extends A>
所以虽然String或Integer是Object的子类,由于上面的原因,你用Message<Object>就不能存放Message<String>或Message<Integer>,如果非要存,那就Message<? extends Object>,因为任何类的根类都是Object,所以与其extends,不如就直接Message<?> 任意类
A有个私有方法a,AA继承A
你有个的集合<A>,里面存放AA
for (A a : 集合) {
a.a(); //因为集合存放的子类AA,子类不能访问A的私有方法,所以此处会运行期出错
}
为了解决上面的问题,泛型规定集合<A>不能存放子类AA,也就是编译器会出错
如果想存放子类,就用集合<? extends A>
所以虽然String或Integer是Object的子类,由于上面的原因,你用Message<Object>就不能存放Message<String>或Message<Integer>,如果非要存,那就Message<? extends Object>,因为任何类的根类都是Object,所以与其extends,不如就直接Message<?> 任意类
public static void fun(Message<Object> msg)Message<String> obj=new Message<String>();
obj.setMsg("Hello World!");
fun((Message<Object>)obj); //强型转换