为什么静态泛型方法在返回类型之前需要类型参数

时间:2018-09-10 14:04:09

标签: java generics methods static generic-method

下面的noGood方法会导致编译错误,因为它在返回类型T之前立即省略了形式类型参数。

public static T noGood(T t) {
  return t;
}

请帮助我理解为什么静态泛型方法要求在返回类型之前具有类型参数?非静态方法不是必需的吗?

4 个答案:

答案 0 :(得分:5)

实例化该类时,将声明类型参数(T)。因此,实例方法不需要类型参数,因为它是由实例定义的。

另一方面,

static方法不属于实例-它们属于类。由于没有实例可以获取类型信息,因此必须为方法本身指定实例。

答案 1 :(得分:2)

T未定义。修饰符的顺序和返回类型保持不变。

public static <T> T noGood(T t) {
    return t;
}

答案 2 :(得分:2)

使用泛型时,需要使用<>表示法声明它们

  1. 在班上

    public class Foo<T, U, V>{
    
    }
    
  2. 在方法中,返回类型之前

    public static <T, U extends Number, V> T foo(T t) {
        U u = ..;
        ...
    }
    
    public static <T> int foo(T t) {
        ...
    }
    

答案 3 :(得分:1)

首先,这是语言的标准。即使在C ++中:

template <class myType>
myType GetMax (myType a, myType b) {
    return (a>b?a:b);
}

您在通用函数上方声明类型参数。

当它是类的成员函数时,它可以访问该类的类型参数。如果它不是静态的,那么您需要显式声明它们。