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

时间:2016-05-25 21:41:15

标签: java generics methods

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

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

public static void main(String[] args) {
    f(Integer.MIN_VALUE, "...");
}

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

1 个答案:

答案 0 :(得分:4)

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

要验证这一点,请返回T

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

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

Number number = f(Integer.MAX_VALUE, BigDecimal.ONE); 

现在,已解决的类型为Number,因为这两种类型都是Number的子类型,以及Serializable,当然还有Object