泛型(6)-泛型方法

时间:2021-09-10 17:34:54

  前面介绍了在定义类,接口时可以使用泛型形参,在该类的方法定义和成员变量定义,接口的方法定义中,这些泛型形参可以被当成普通类型来使用.在一些另外的情况下,定义类,接口时没有使用泛型形参,但定义

方法时想自己定义泛型形参,这也是可以的,Java5还提供了对泛型方法的支持.

      定义泛型方法

  定义一个方法将一个Object数组的所有元素添加到一个Collection集合中,可以考虑采用如下的代码来实现

package com.j1803.generic_method;
import java.util.Collection;
public class Demo1 {
static void fromArrayToCollection(Object[]a, Collection<Object>c){
for(Object obj:a){
c.add(obj);
}
}
}

这个方法只能将Object[]数组的元素复制到元素为Object(Object的子类不行)的Collection集合中,如果将Object改为?,那也不可以,因为Java不允许把对象放进一个未知的集合中.
Java5提供了解决这个问题的办法,提供了泛型方法(Generic Method).所谓泛型方法,就是在声明方法时定义一个或者多个泛型形参.泛型方法的语法格式如下.
修饰符<T,S>返回值类型 方法名(形参列表){
方法体...
}
相比普通方法,泛型方法的方法名签名与普通方法的方法签名多了泛型形参的声明,泛型形参的声明以尖括号括起来,多个泛型形参之间用','隔开,所有的泛型形参声明放在方法修饰符和方法返回值之间.
将上面的改为如下形式:
package com.j1803.generic_method;
import java.util.Collection;
public class Demo1 {
static <T> void fromArrayToCollection(T[]a, Collection<T>c){
for(T obj:a){
c.add(obj);
}
}
}
完整代码如下:
package com.j1803.generic_method;
import java.util.ArrayList;
import java.util.Collection;
public class Demo1 {
//声明一个泛型方法,该泛型方法中带一个T泛型形参
static <T> void fromArrayToCollection(T[]a, Collection<T>c){
for(T obj:a){
c.add(obj);
}
}
public static void main(String[] args) {
//下面的代码T代表Object类型
Object[]obj=new Object[100];
Collection<Object> co=new ArrayList<>();
fromArrayToCollection(obj,co);
//下面的代码T代表String类型
String[]arr=new String[100];
Collection<String> str=new ArrayList<>();
fromArrayToCollection(arr,str);
//T代表Integer类型
Integer[] ig=new Integer[100];
//T代表Float类型
Float[] fg=new Float[100];
//T代表Double类型
Double[] db=new Double[100];
//T代表Number类型
Number[] nb=new Double[100];
Collection<Number> cn=new ArrayList<>();
fromArrayToCollection(ig,cn);
fromArrayToCollection(fg,cn);
fromArrayToCollection(db,cn);
fromArrayToCollection(nb,cn);
//fromArrayToCollection(arr,cn);//arr为数组,编译错误
}
}

  上面定义的泛型方法,该泛型方法定义了一个T泛型方法,这个T泛型就可以在该方法内当成普通类型使用,与接口,类声明中定义的泛型不同的是,方法声明中定义的泛型只能在该方法里使用,而接口,类声明总定义的泛型则可以在
整个接口,类中使用.
  与类,接口中使用泛型参数不同的是,方法中的泛型参数无须显示传入实际类型参数,如上中调用fromArrayToCollection()方法时,无须再调用该方法前传入String,Object类型,编译器根据实参推断出泛型所代表的类型
package com.j1803.generic_method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ErrorTest {
static <E> void copy(Collection<E>to,Collection<E>from){
for (E s:from) {
to.add(s);
}
}
static <E> void copy2(Collection<? extends E>from2,Collection<E>to2){//?E有什么不同呢
for (E s:from2) {
to2.add(s);
}
}
public static void main(String[] args) {
List<Integer>ig=new ArrayList<>();
List<String>ls1=new ArrayList<>();
//copy(ig,ls1);//编译错误
List<String>ls2=new ArrayList<>();
copy(ls1,ls2);
List<Number>ln=new ArrayList<>();
copy2(ig,ln);
//copy2(ln,ig);//编译错误
}
}