【问题标题】:Is it possible for me to have a method that can take both a HashMap or a list as an argument?我是否有可能拥有一个可以同时将 HashMap 或列表作为参数的方法?
【发布时间】:2016-03-10 17:49:47
【问题描述】:

我有一个类似下面列出的函数:

 private static void getNumberOfBrowsers(Collection<?> tcName){
 }

我是否有可能有一个只接受一个参数的方法,但它可以是HashMap&lt;String, String&gt;List&lt;String&gt;

【问题讨论】:

  • 你会用这种方法做什么?你会如何看待其中的论点?
  • 您要解决的问题是什么?最好有两个方法,重载,并将通用功能分解到一个方法中,这两个方法都调用

标签: java list methods parameters hashmap


【解决方案1】:

可能,但几乎可以肯定是个非常糟糕的主意。他们的共同点是Object:

private static void getNumberOfBrowsers(Object tcName){
   // Need instanceof or similar here
}

相反,考虑一个重载方法:

private static void getNumberOfBrowsers(Map<String, String> tcName){
}

private static void getNumberOfBrowsers(List<String> tcName){
}

旁注:我在上面使用了Map&lt;String&gt;,而不是HashMap&lt;String&gt;。通常,除非您有充分的理由需要特定类型的东西,否则最好对接口进行编码。

【讨论】:

  • 太棒了!我可以走重载的方法路线,但为什么使用 Object 是个坏主意?我可以使用 intanceOf 进行一些验证,以检查我是否得到了我应该更正的内容?
  • @SahilGupta:如果您使用Object,我可以使用Thread 调用getNumberOfBrowsers。或Date。或String。任何东西,真的......所以你必须为编译时错误抛出运行时异常。真的,最好在编译时捕获它们。
  • 你是对的。我将走重载方法路线。感谢您的帮助!
【解决方案2】:

您也可以使用模板类。但是,这可能是矫枉过正。重载会更简单。

public class Box<T> {
   // T stands for "Type"
   private T t;

   public void set(T t) { this.t = t; }
   public T get() { return t; }
}

示例来自:https://docs.oracle.com/javase/tutorial/java/generics/types.html

【讨论】:

  • 我没有投反对票,但我认为你是对的,模板类可能有点矫枉过正。我将使用方法重载。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2014-01-30
相关资源
最近更新 更多