【发布时间】:2015-03-30 14:09:50
【问题描述】:
下面是示例代码,这让我对泛型情况下 java 方法重载的工作方式感到困惑。
问题是:如果我用泛型参数重载方法,为什么我需要有不同的返回类型?
我知道擦除删除 <T> 而我只有 List ,这对于编译器来说是模棱两可的,但是不同的返回类型如何帮助决定调用哪个方法?
public static void main(String args[]) throws Exception {
PracticeGenerics p = new PracticeGenerics();
p.test();
}
private void test() throws Exception {
//print(null); //The method print(List<String>) is ambiguous for the type PracticeGenerics
print(new LinkedList<String>());
print(new LinkedList<Integer>());
}
public String print(List<String> list){
System.out.println("print string");
return null;
}
public Object print(List<Integer> list){
System.out.println("print Integer");
return null;
}
我机器上的Java版本:
java版本“1.6.0_31”
Java(TM) SE 运行时环境(内部版本 1.6.0_31-b05)
Java HotSpot(TM) 64 位服务器 VM(内部版本 20.6-b01,混合模式)
【问题讨论】:
-
为什么不直接将方法重命名为
printIntegerList和printStringList,这样调用的方法就不会有歧义了? -
不确定我是否明白您的问题。具有不同的返回类型不足以编译该代码。此外,您的代码示例包含一个关于传递空值的注释部分 - 这与您的问题完全相关吗?
-
@Mohit 您使用的是哪个编译器?我已经为 Java 8 尝试了 Eclipse 和
javac,但它拒绝编译你的代码。 -
我认为问题出在 Eclipse 上。当涉及泛型时,IDE 似乎会在检查擦除时测试返回类型,但基本的 Java 编译器只会检查名称和参数。这可能是要求报告错误
标签: java generics overloading