请看:
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>反而不行呢?

解决方案 »

  1.   

    你改成Message<Object> msg,你传的参数是Message<String> obj,Message<Integer> obj1,泛型不匹配
    要么你就还是原来的Message<?> msg //任意类型,要么你就Message<? extends Object> msg //其实跟任意类型一样
    不加泛型和Message<Object>并不等价,不加泛型会编译警告,类型转换安全要自己控制,加了泛型,类型不一致会编译通不过
      

  2.   

    1、
    你改成Message<Object> msg,你传的参数是Message<String> obj,Message<Integer> obj1,泛型不匹配
    ===================
    可是String、Integer的父类都是Object,为什么说类型不匹配?2、不加泛型时,传的参数是Message<String> obj,Message<Integer> obj1,它们如何与 Message  msg进行匹配?
    也就是说在传递时它们如何进行对应?(实参如何与虚参对应)
      

  3.   

    举个简单的例子
    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<?> 任意类
      

  4.   

    举个简单的例子
    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<?> 任意类
      

  5.   

    当然,为了避免编译期出错,你也可以强型转换,可能也会出现编译警告
    public static void fun(Message<Object> msg)Message<String> obj=new Message<String>();
    obj.setMsg("Hello World!");
    fun((Message<Object>)obj); //强型转换