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)
因此,如果我的方法是使用一种类型进行参数化,并且我在两个参数中使用那个类型,为什么它允许我发送两个完全不同类型的对象?我猜想它归结为治疗T
的Object
?
尽管 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 Object
course 的子类型。