Java中关于泛型方法中类型变量的确定
首先:在我们使用泛型的时候我们要显示的告诉编译器所要使用的具体类型,比如:
//新建了一个Integer类型的ArrayList。并在<>中指明了类型。
ArrayList<Integer> list = new ArrayList<Integer>();
//还可以将代码简化为如下形式:在这个过程中是编译器帮我们完成了自动类型推断。
ArrayList<Integer> list = new ArrayList<>();
所以,有一个问题很困惑我:**我们在调用泛型方法时并没有显示的指明类型变量的具体类型,那方法是怎么拿到我具体类型的呢?**当然你可以直接说是类型推断,对的没错肯定是类型推断,但是有没有什么依据呢?
如下,定义了一个泛型方法:
class ArrayAlg{
//返回数组的中间数
public static <T> T getMiddle(T[] a){
return a[a.length/2]
}
}
//当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:
String[] names = {"Jonn", "Q" , "public"};
String middle = ArrayAlg.<String>getMiddle(names);
在这种情况下(实际也是大多数情况)下,方法调用可以省略类型参数。编译器有足够的信息能够能够推断出所调用的方法。它**用names的类型(即String[ ])与泛型类型T[ ]进行匹配并推断出T一定时String。**也就是说,可以调用
String middle = ArrayAlg.getMiddle(names);
这就成了我们平时使用的方式,也就是说我们其实是省略了显示的指明方法的参数类型这步骤,编译器帮我们自动完成。
参考资料:
《Java核心技术》(第八版)
《C++ Primer Plus》(第六版)