【问题标题】:Overloading Methods in Java with generics [duplicate]使用泛型重载Java中的方法[重复]
【发布时间】:2020-01-18 18:45:22
【问题描述】:

我想知道是否可以通过改变泛型参数来重载方法。示例:

class Foo <T> { ... }

class Bar {
  public void do (Foo<Integer> obj) {}
  public void do (Foo<Double> obj) {}
}

我知道这不会被编译。但是例如在 kotlin 中,您有注释 JvmName,您可以在其中注释这些方法以编译代码。 Java也有这种可能性吗?

【问题讨论】:

  • 没有。类型擦除。 Foo&lt;Anything&gt; 变成 Foo&lt;Object&gt;,因为它必须。
  • 处理此问题的正确方法是处理Foo&lt;Number&gt; 并在必要时区分方法中的类型。
  • 不,这在 java 中是不可能的。从注释中,我怀疑注释重命名了字节码中的方法,从而使调用明确。我建议重命名这些方法,以便它们的名称彼此不同。
  • Java 泛型存在缺陷,不如 C# 中使用的泛型强大。
  • @HovercraftFullOfEels 这就是向后兼容的代价。 C# 不必做出这样的选择。

标签: java overloading


【解决方案1】:

同一类型中不能有两个具有相同擦除的方法。也就是说,您可以操纵保留相同类型的擦除。例如,如果Foo 是一个接口:

interface Foo<T> { /* ... */ }

class Bar {
    public void do_(Foo<Integer> obj) { }
    public <A extends Object & Foo<Double>> void do_(A obj) { }
}

但是,避免重载方法,即使不涉及泛型也是如此。

【讨论】:

  • 那么,为了实现双重调度,访客设计模式的重载方法不是很好吗?
  • 介意详细说明你的最后一句话吗?我认为方法重载是 Java 等语言的一个关键(也是有用的)特性......
  • @HovercraftFullOfEels 访客模式?是的,像使用动态类型语言一样使用有意义的名称。它的好处是,它意味着不必固定为被遍历的层次结构的一种表示的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2022-08-14
相关资源
最近更新 更多