我看的是java核心技术,里面有句话不是很理解。说的是:类型参数不能在静态方法中使用!我找了书中很多的例子,但是对使用方法还是不是很了解,和这样规定的原因所在!
     比如:public static <T> T print(){....}//correct
           public static <T> void print(){....}//correct
     但是:public static T print(){.....}//wrong
还有泛型方法到底是加了<T>的方法,还是加了T的方法!!!!????

解决方案 »

  1.   

    <T>表示泛型 T表示一个未知的类,单看你那句话让人迷糊,或许应该联系上下文看吧。
      

  2.   

    我也有个问题:为什么不能用static修饰构造器?
      

  3.   

    OK,我自己来回答吧!
    第一种情况:public static <T> T print(){....}是一个泛型方法,在类型擦除时,<T>去掉,剩下的T会统一换成Object!
    第二种情况:public static <T> void print(){....}直接擦出<T>就行了,也是一个泛型方法。
    第三种情况:public static T print(){.....} 这不是一个泛型方法,而是一个普通方法,只是返回类型是T而已,如果敲代码试试的话,会报一个错:Cannot make a static reference to a non_static reference!!,这和我们在静态方法中引用一个非静态的方法报的错类似,原因也是类似的!
    但是这里又有一个新的问题:一个泛型类:class GenericTest<T,U>{
    pubic static <T> U print(){....}  }这样的方法又会报个错:Cannot make a static reference to a non_static reference,类型变量是有两个T,U,但是在此方法中是无法识别U的!!!
    难道<T> T一起出现,才会将T擦掉!!而如U单独出现,又无法擦掉!!!
      

  4.   

    是说泛型类的类型参数不能用在静态申明,这个申明是说成员包括常量和变量还有方法。
    至于上述的三种情况、这个与类中申明的类型参数没有关系了,因为你这是在申明泛型方法,就像是独立声明,可以用其它的代替,它跟类中的那个参数是没有关系的。
    例如:
    class stack<E,U>
    {
       //1、public static <T>T print(){  return((T)new Object())}
       //2、public static <T> void print(){}
       //3、public static <T,F> F print(){  return((U)new Object())} 注意这个方法的类型参数是T和F ,与类的参数类表不一样。
       //上面的方法都是可以的、下面的去是不行的
        //4、public static <T> U print(){ return((U)new Object())}
       //这个方法会报错,是因为在这个泛型方法的参数列表中没有U这个参数。
    }
    希望有所理解。静态申明成员不能使用类的类型参数。