可能我错过了一些东西,也许我的假设是错误的,但我认为当我用类型T
声明参数化方法时,无论该类型有多少变量,它仍然是相同的类型。但是我看到这个编译并且它反映了我的看法。
static <T> void f(T a, T b) { }
public static void main(String[] args) {
f(Integer.MIN_VALUE, "...");
}
因此,如果我的方法是使用一种类型进行参数化,并且我在两个参数中使用那种类型,为什么它允许我发送两个完全不同类型的对象?我想这归结为将T
视为Object
?
答案 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
。