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(不是)。因此,编译器将报告错误。