Java 为什么静态泛型方法应该有<;T>;返回类型前面

Java 为什么静态泛型方法应该有<;T>;返回类型前面,java,generics,Java,Generics,为什么泛型静态方法有一个addition-to-return类型,而实例方法没有 public class Main<T> { public static <T> T met(T t) { return t; } public T met1(T t) { return t; } } 公共类主{ 公共静态T-met(T-T){ 返回t; } 公共交通1(T){ 返回t; } } 实例方法还可以在返回类型

为什么泛型静态方法有一个addition-to-return类型,而实例方法没有

public class Main<T> {
    public  static <T> T met(T t) {
        return t;
    }

    public  T met1(T t) {
        return t;
    }
}
公共类主{
公共静态T-met(T-T){
返回t;
}
公共交通1(T){
返回t;
}
}

实例方法还可以在返回类型前面定义泛型类型参数(
),但它不必这样做,因为它可以使用类级别(
公共类主
)中已定义的泛型类型参数

另一方面,静态方法不能使用在类级别定义的泛型类型参数,因此它必须声明它打算使用的任何泛型类型参数

i、 e.以下两项均有效

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

public <T> T met1(T t) {
    return t;
}

T
被假定为类型标识符(即某些类或接口的名称),而不是泛型类型参数。

这有两个方面:

(A)

实例方法隐式获取所有类类型参数,而静态方法则不获取。这样做的原因是,在编译时,分配给这些类型参数的类型特定于每个对象实例引用,因此它们永远不会应用于静态方法,因为这些方法没有与它们关联的特定实例

(B)


所有方法、实例或类都可以定义仅适用于该方法的其他类型参数。它们位于修饰符(
public
static
,…)和返回类型之间。这只是Java语言开发人员任意选择的语法。因此,他们可能会采取不同的做法,但是在使用之前(例如,在参数类型声明中)必须声明某些内容更有意义。

首先,我们需要了解什么是“添加”。它不是对返回类型的添加。这是一个“

有界类型参数有时可能需要限制 可以用作参数化类型中的类型参数的类型。 例如,对数字进行操作的方法可能只希望 接受Number或其子类的实例。这是什么 类型参数用于

编译泛型类/方法/接口时。Java编译器将泛型类型转换为JVM能够理解的代码。这个过程是调用类型擦除,它需要知道泛型的类型参数的边界。i、 e.
get转换为
对象
,因为它是无界的,并且
get转换为
可比的


其次,为什么泛型
静态
方法需要有界类型参数,而泛型实例方法不需要

这种方法与类方法和实例方法之间的差异密切相关

  • 使用关键字
    static
    时,该方法将成为类方法。这意味着您可以在不创建实例的情况下调用。这就是问题所在。因为
    static
    方法在类的所有实例(包括不同类型参数的实例)之间共享,所以在实例化类型之前,Java不知道t是什么。我们需要显式地告诉编译器类方法应该期望什么样的实例

  • 当您不使用关键字
    static
    时,该方法现在是一个实例方法。这意味着在创建类的实例之前不能调用该方法。创建实例时,需要指定类型参数。Java编译器可以在调用实例方法时内在地使用该类型参数,所以有界类型参数对于实例方法是可选的


尝试进行一些前期研究。
met1
的声明似乎是非法的,因为
T
在我能看到的任何地方都没有定义。在哪里定义了
T
?您的包中是否有类
T
?@GhostCat如果该类没有声明名为(T)的泛型类型参数,则假定T是某个实际类或接口的名称,而不是泛型类型参数。
public static T met(T t) {
    return t;
}