Java泛型方法
时间:2020-01-09 10:36:00 来源:igfitidea点击:
可以泛化Java中的方法。这是一个例子:
public static <T> T addAndReturn(T element, Collection<T> collection){ collection.add(element); return element; }
该方法指定类型T,该类型T既用作" element"参数的类型,又用作" Collection"的通用类型。注意现在如何将元素添加到集合中。如果我们在Collection
参数定义中使用了通配符,那么这是不可能的。
那么,编译器如何知道T的类型?
答案是,编译器从我们对方法的使用中推断出这一点。例如:
String stringElement = "stringElement"; List<String> stringList = new ArrayList<String>(); String theElement = addAndReturn(stringElement, stringList); Integer integerElement = new Integer(123); List<Integer> integerList = new ArrayList<Integer>(); Integer theElement = addAndReturn(integerElement, integerList);
注意我们如何使用String和Integer以及它们对应的集合来调用addAndReturn()方法。编译器从" T"参数的类型和" collection <T>"参数定义的类型中知道,类型将在调用时(使用时)从这些参数中获取。
编译器甚至可以执行更高级的类型推断。例如,以下调用也是合法的:
String stringElement = "stringElement"; List<Object> objectList = new ArrayList<Object>(); Object theElement = addAndReturn(stringElement, objectList);
在这种情况下,我们为T使用两种不同的类型:"字符串"和"对象"。然后,编译器使用最特定的类型参数使方法调用类型正确。在这种情况下,它推断T为"对象"。
相反,这是不合法的:
Object objectElement = new Object(); List<String> stringList = new ArrayList<String>(); Object theElement = addAndReturn(objectElement, stringList);
在这种情况下,编译器推断,为使方法调用的类型安全,T必须为" String"。然后,为T元素参数传入的objectElement也必须是String(不是)。因此,编译器将报告错误。