Java中的泛型方法<t> </t>

时间:2014-06-09 04:47:04

标签: java generics

下一个方法是通用的,但我只想知道<T>的有用性是什么?我的意思是<T>谁是静态的,之前是无效的。如果我不在我的方法中写它会怎么样?

public static <T> void nameMethod(BinaryTreeNode<T> t){
     /*do something
         .
         .
     */
}

谢谢。

1 个答案:

答案 0 :(得分:2)

<T>为方法的整个上下文定义了一个类型参数。据我所知,在这种特殊情况下,它确实等同于

public static void nameMethod(BinaryTreeNode<?> t) {

但是,如果您返回类型T,或者如果您有多个具有相同泛型类型的参数,则需要声明type参数,以便编译器具有一个参考点来标识类型。例如:

public static <T> List<T> mergeSort(List<T> l1, List<T> l2) {
    //...
}

<T>参数告诉编译器传递的List和返回的List必须是相同的泛型类型。

当我们可以声明有关T的其他信息时,这会更有用:

public static <T extends Number> List<T> asList(T... numbers) {
    //build list with Number-specific logic...
}

编辑:我的第一点不正确。即使没有其他参数或返回类型,也可以用于声明<T>。我将使用List提供一个简单示例,因为我不熟悉此BinaryTreeNode

public static <T> void duplicateFirstElement(List<T> l) {
    T elm = l.get(0);
    l.add(elm);
}

如果我们要删除type参数并将参数声明为List<?>,那么在与列表交互时就无法保留泛型类型。