【问题标题】:Method overloading with generics [duplicate]使用泛型重载方法[重复]
【发布时间】:2020-04-27 05:07:46
【问题描述】:

我尝试创建两个静态重载方法时遇到编译错误。谁能解释一下?

public class A {
 public static void a(Set<String> stringSet) {}
 public static void a(Set<Map<String,String>> mapSet) {}
}

【问题讨论】:

    标签: java generics


    【解决方案1】:

    原因是type erasure。泛型不存储在类中,它们只是编译时信息,因此在运行时,这两个方法是相同的,因此存在命名冲突。

    参考

    这三个方法实际上是相同的(阅读:它们产生相同的字节码):

    public static void a(Set plainSet) {}
    public static void a(Set<String> stringSet) {}
    public static void a(Set<Map<String,String>> mapSet) {}
    

    如果你真的想拥有两个独立的方法,你必须提供不同的方法签名(例如不同的方法名称,其中一个方法的附加参数等)

    【讨论】:

    • 方法解析是在编译时完成的,因此可以扩展 Java 语言以允许这种类型的重载而无需具体化。但是,坚持更好的方法命名可能更简单。
    • 是的,但目标是不破坏二进制格式(旧代码必须继续工作,即使使用新代码)
    【解决方案2】:

    从方法参数Set&lt;String&gt;Set&lt;Map&lt;String,String&gt;&gt; 的角度来看是相同的,因为泛型类的所有实例都具有相同的运行时类(在您的情况下设置),而不管它们的实际类型参数如何.因此,您将获得erasure error。同样在运行时两者看起来像...... public static void a(Set stringSet) {}public static void a(Set mapSet) {}

    【讨论】:

      【解决方案3】:

      您收到编译器错误,因为方法未正确重载。这两种方法都有一个 Set 类型的参数,这使得两种方法对于编译器来说都是相同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-19
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多