【问题标题】:Why I need different return types, when overloading generic methods为什么在重载泛型方法时需要不同的返回类型
【发布时间】: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,混合模式)

【问题讨论】:

  • 为什么不直接将方法重命名为printIntegerListprintStringList,这样调用的方法就不会有歧义了?
  • 不确定我是否明白您的问题。具有不同的返回类型不足以编译该代码。此外,您的代码示例包含一个关于传递空值的注释部分 - 这与您的问题完全相关吗?
  • @Mohit 您使用的是哪个编译器?我已经为 Java 8 尝试了 Eclipse 和 javac,但它拒绝编译你的代码。
  • 我认为问题出在 Eclipse 上。当涉及泛型时,IDE 似乎会在检查擦除时测试返回类型,但基本的 Java 编译器只会检查名称和参数。这可能是要求报告错误

标签: java generics overloading


【解决方案1】:

重载,简单来说,就是拥有两个或多个同名签名不同的方法。

方法的签名由方法名称和参数组成。重载方法时,显然名称会相同,这意味着重载的方法只有参数列表不同

返回类型与方法重载无关!

【讨论】:

  • 我也有同样的理解,但现在我遇到了这个问题......我希望有人能确认这是一个错误,或者让我们等待任何人提供一些额外的信息。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2010-12-07
  • 2021-11-06
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多