我看的是java核心技术,里面有句话不是很理解。说的是:类型参数不能在静态方法中使用!我找了书中很多的例子,但是对使用方法还是不是很了解,和这样规定的原因所在!
比如:public static <T> T print(){....}//correct
public static <T> void print(){....}//correct
但是:public static T print(){.....}//wrong
还有泛型方法到底是加了<T>的方法,还是加了T的方法!!!!????
比如:public static <T> T print(){....}//correct
public static <T> void print(){....}//correct
但是:public static T print(){.....}//wrong
还有泛型方法到底是加了<T>的方法,还是加了T的方法!!!!????
第一种情况: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单独出现,又无法擦掉!!!
至于上述的三种情况、这个与类中申明的类型参数没有关系了,因为你这是在申明泛型方法,就像是独立声明,可以用其它的代替,它跟类中的那个参数是没有关系的。
例如:
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这个参数。
}
希望有所理解。静态申明成员不能使用类的类型参数。