最近在看thinking in java的泛型一章,看得头晕,感觉这泛型好绕啊,
问下无界通配符与原生类的区别:
class TestHolder <T>{
         private T value ;
         public TestHolder() {}
         public TestHolder(T val)  {
                   value = val ;
         }
         public void set(T val) { value = val ;}
         public T get() { return value ;}
         public boolean equals(Object obj) {
                   return value.equals(obj) ;
         }
}
public class Wildcards {
         static void rawArgs(TestHolder holder, Object arg) {
               holder.set(arg) ;   //会有警告,但不会有错误
               holder.set(new Wildcards()) ;
         }
         static  void unboundedArg(TestHolder<?> holder, Object obj) {
                holder.set(arg) ;    //会有错误
                Object obj = holder.get() ;
          }
}
为什么rawArgs方法内的holder.set(arg)不会有错误,而unboundedArg方法内的holder.set(arg)会有错误啊?
望大家指教啊

解决方案 »

  1.   

    补充一下,Wildcards类,public class Wildcard { 
    static <T> T exact1(TestHolder<T> holder) {
                        T t = holder.get() ;
                        return t ;
              }          static <T> T exact2(TestHolder<T> holder, T arg) {
                        holder.set(arg);
                        T t = holder.get() ;
                        return t ;
              }
              public static void main(String[] args) {
                       TestHolder<Long> qualified = new TestHolder<Long>();
                        TestHolder<?> unbounded = new TestHolder<Long>() ;
                        TestHolder<? extends Long> bounded = new TestHolder<Long>() ;
                        Long lng = 1L ;                    Long l1 = exact1(qualified,lng);  //不会报错
                        Object r = exact1(unbounded);  //不会报错
                        Long l2 = exact2(qualified,lng);  //不会报错
                        Long l3 = exact2(bounded,lng);  //报错
              }
    }帮忙解释一下
      

  2.   

    http://xiami9910.blog.163.com/blog/static/303135542007111243953/一定对你有帮助
      

  3.   

    1: 关于rawArgs为啥不报错,我想大家都能理解。TestHolder里面的value想放啥都可以,所以i]holder.set(Object)[/i]也是允许。2:对于unboundedArg来说,参数是TestHolder<?>,也就是说TestHolder是个未知的类型。所以既然是未知,也就是说<?>可能是String,也可能是List,这样的话b编译器当然不能允许holder.set(Object)
      

  4.   

     static  void unboundedArg(TestHolder<?> holder, Object obj) {
                    holder.set(arg) ;    //会有错误
                    Object obj = holder.get() ;
              }
    你上面的参数是"Object obj"下面set(arg)当然错啦,arg哪里来的?