【问题标题】:How to overload method with different typed Lists? [duplicate]如何使用不同类型的列表重载方法? [复制]
【发布时间】:2018-07-09 04:55:57
【问题描述】:

是否可以重载参数为不同类型的List<>的方法?

例如,我希望创建两个这样定义的方法:

public void getChanges(List<TypeOne>){}
public void getChanges(List<TypeTwo>){}

但是,由于两种方法都接受List,因此存在冲突。有没有办法让方法考虑到列表中的对象类型 within

编译器没有意识到签名确实不同,这对我来说似乎很奇怪,因为 List&lt;TypeOne&gt;List&lt;TypeTwo&gt; 不同。

【问题讨论】:

  • 简短的回答,两者都被视为List&lt;Object&gt;,因此这里不可能出现过载。
  • 你可以这样做 public void getChanges(List&lt;TypeOne&gt;){}public void getChanges(List&lt;TypeTwo&gt;, int a){} 其中int a 是一些无用的价值。
  • @nimi0112 - 感谢您的解决方法,但这绝对是一个非常糟糕的习惯......
  • @Zephyr - 这可能是个坏习惯,但它不会弄乱代码,也不需要其他变量分配,而且它的使用可以在 cmets 中轻松解释。
  • @nimi0112 除了引入无用的参数外,“不会弄乱代码”,让未来的代码读者想知道它到底意味着什么。重命名方法是非常可取的。

标签: java overloading type-erasure


【解决方案1】:

您必须给它们起不同的名称,因为上述方法具有相同的擦除

关于具体泛型类型的信息不存储在运行时,所以如果你保留上面的签名,如果你将任何对象列表作为参数传递,JVM 将无法意识到应该在运行时调用什么方法。

有关擦除的更多信息,请参阅https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

【讨论】:

  • 您能否添加更多信息而不只是链接?有关链接,请参阅 How to Answer
  • 当然!我将添加更多详细信息
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多