【发布时间】:2016-03-10 18:21:41
【问题描述】:
假设我有以下代码:
// Method acception generic parameter
public static <T> T foo(T para) {
return para;
}
// Method accepting Integer parameter
public static Integer foo(Integer para) {
return para + 1;
}
// Method accepting Number parameter
public static Number foo(Number para) {
return para.intValue() + 2;
}
public static void main(String[] args) {
Float f = new Float(1.0f);
Integer i = new Integer(1);
Number n = new Integer(1);
String s = "Test";
Number fooedFloat = foo(f); // Uses foo(Number para)
Number fooedInteger = foo(i); // Uses foo(Integer para)
Number fooedNumber = foo(n); // Uses foo(Number para)
String fooedString = foo(s); // Uses foo(T para)
System.out.println("foo(f): " + fooedFloat);
System.out.println("foo(i): " + fooedInteger);
System.out.println("foo(n): " + fooedNumber);
System.out.println("foo(s): " + fooedString);
}
输出如下所示:
foo(f): 3
foo(i): 2
foo(n): 3
foo(s): Test
现在的问题:
-
foo(n)调用foo(Number para),很可能是因为n被定义为Number,即使它分配了Integer。那么,在没有动态绑定的情况下,我是否正确地假设采用哪些重载方法的决定发生在编译时? (关于静态和动态绑定的问题) -
foo(f)使用foo(Number para),而foo(i)使用foo(Integer para)。只有foo(s)使用通用版本。因此,编译器总是查看给定类型是否存在非泛型实现,并且只有在没有时才回退到泛型版本? (关于泛型的问题) - 同样,
foo(f)使用foo(Number para),而foo(i)使用foo(Integer para)。然而,Integer i也将是Number。所以总是采用继承树中“最外层”类型的方法吗? (关于继承的问题)
我知道这些问题很多,并且该示例并非来自生产代码,但我只想知道“发生了什么”以及为什么会发生。
非常感谢任何指向 Java 文档或 Java 规范的链接,我自己找不到它们。
【问题讨论】:
标签: java generics inheritance overloading