泛型方法定义

162 阅读1分钟
class ArrayAlg {
	public static <T> T getMiddle(T... a) {
    	return a[a.length/2];
    }
}

这个方法是在普通类中定义的,而不是在泛型类中定义的。然而,这是一个泛型方法,可以从尖括号和类型变量看出来这一点。

泛型方法可以在普通类和泛型类中定义。

类型变量放在修饰符后面(这里是public static),返回类型前面。

当调用一个泛型方法的时候,在方法名前的尖括号中放入具体的类型:

String middle = ArrayAlg.<String>getMiddle("John", "Q.", "Public");

在这种情况(其实也是大多数情况下)下,方法调用中可以省略<String>类型参数。编译器有足够的信息能够推断出调用方法的类型参数。也就是说,我们可以这样调用泛型方法:

String middle = ArrayAlg.getMiddle("John", "Q.", "Public");

但在某些情况下,编译器也会提示错误,看下:

double middle = ArrayAlg.getMiddle(3.14, 78, 0);

对于上面代码,编译器会将参数打包成1个Double对象和两个Integer对象,然后找到它们的共同超类型。这里Double类和Integer类的共同超类型可以是Number类型或者Comparable接口等。

在上面代码ArrayAlg.getMiddle方法返回的对象类型和我们要赋值不一致,所以编译器会出错。要解决这个问题,我们可以将参数类型全部变成Double 或者改变middle变量的类型。如下:

double middle = ArrayAlg.getMiddle(3.14, 78D, 0D);

Number middle = ArrayAlg.getMiddle(3.14, 78, 0);