第一:泛型方法没有在返回值前面加上<?>,那么这个就不是泛型方法。这个方法中的参数中的泛型,是类指定的泛型。
比如PersonArray类,
class PersonArray<T>{ private T t; public void setObject(T t){ this.t = t; } } 其中的setObject方法中的T指定是PersonArray中的T。也就是说SetObject方法中传递的参数类型必须与PersonArray中泛型的类型一致。
第二:泛型方法的定义。
你提到“接收集合上已经定义了泛型,返回值类型前面为什么还要定义<T>?”
这是因为泛型类定义的泛型在整个类中有效,为了让不同方法可以操作不同类型,而且类型不确定,所以将泛型定义在方法上。
class Demo<T>{
private T t;
public void setObject(T t){
this.t = t;
}
public <T> void show(T t){
System.out.println(t);
}
}
setObject方法中接受的参数类型必须与Demo指定的类型是一致的,而show方法接受的参数类型与Demo指定的类型可以相同也可以不同。
第三:静态方法的泛型
静态方法不可以访问类上定义的泛型,如果静态方法要操作的应用数据类型不确定,可以将泛型定义在方法上。
你这里的“private static <T> void printColl(ArrayList<T> al)”printColl方法是静态的,如果返回值类型前面不定义<T>?,就是访问了类上定义的泛型,就会编译失败。
|