使用一种类型参数化的方法接受两种类型

cto*_*mek 6 java generics methods

可能我错过了一些东西,也许我的假设是错误的,但我认为当我用类型声明参数化方法时,T无论该类型有多少变量,它仍然是相同的类型.但是我看到这个编译并且它反映了我的观点.

static <T> void f(T a, T b) { }

public static void main(String[] args) {
    f(Integer.MIN_VALUE, "...");
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我的方法是使用一种类型进行参数化,并且我在两个参数中使用那个类型,为什么它允许我发送两个完全不同类型的对象?我猜想它归结为治疗TObject

Sle*_*idi 4

尽管 Integer 和 String 是两种不同的类型,但它们仍然共享一个共同的超类型。Serializable

为了验证这一点,让我们返回T

static <T> T f(T a, T b) {
    return null;
}
Serializable s = f(Integer.MIN_VALUE, "..."); // compiles
Run Code Online (Sandbox Code Playgroud)

编译器将解析(或推断,不确定技术术语)最具体的类型。例如,

Number number = f(Integer.MAX_VALUE, BigDecimal.ONE); 
Run Code Online (Sandbox Code Playgroud)

现在,类型已解析,Number因为这两种类型都是Number, 以及Serializable, and Objectcourse 的子类型。

  • 我相信常见的超类型实际上是“Object”。它可以在两个类的实例上编译良好,这些类的实例除了“Object”之外没有共同的超类型。 (3认同)