【问题标题】:Accept any type for which there's a suitable method接受任何有合适方法的类型
【发布时间】:2020-05-02 16:33:26
【问题描述】:

我有类MyClass,它使用相同的方法名进行重载:

public class MyClass {
   void add(Integer val) {
      // ...
   }

   void add(Boolean val) {
      // ...
   }
}

现在我想用一个额外的add 方法扩展这个类,该方法采用Collection<..>。但是,集合的内部类型必须能够作为参数传递给已经实现的add

public class MyClass {
   void add(Integer val) {
      // ...
   }

   void add(Boolean val) {
      // ...
   }

   void add(Collection<Object> value) {
      for (Object v : value) {
         add(v);  // <-- ERROR here
      }
   }
}

当运行它时,它会以error: no suitable method found for add(Object) 失败。我确实了解为什么这不起作用。所以我的问题是,我如何指定Collection&lt;..&gt; 的方式是:

"接受一个内部类型有合适的add 方法的集合"

非常感谢。

--- 编辑---

找到唯一可行的解​​决方案是这样做:

   void addIntegers(Collection<Integer> value) {
      for (Integer v : value) {
         add(v);
      }
   }

   void addBooleans(Collection<Boolean> value) {
      for (Boolean v : value) {
         add(v);
      }
   }

【问题讨论】:

  • 在这个特定的例子中,我想说你只需要一个add(Object o) 方法。我的意思是,你不是在调用v.add(...),而是将v 作为参数传递。
  • @FedericoklezCulloca 我想更精确地处理类型,例如指定IntegerBoolean。除了定义add(Object o),没有别的办法了吗?
  • 取决于您希望该方法执行的操作。就目前而言,不可能以任何其他方式回答您的问题(除了我在当前答案中看到的,您似乎不喜欢)。但是,除非你的意思是 another add 方法在参数 inside 上被调用,否则 Object 似乎是正确的传递,因为你看起来并不关心里面有什么add
  • @FabioLama 您能否接受以下其中一项或解释为什么这些答案不起作用?

标签: java generics operator-overloading type-bounds


【解决方案1】:

您可以如下声明通用T

     <T> void add(Collection<T> value) {
        for (T v : value) {
            if(v instanceof Boolean) {
                add((Boolean) v);
            } else if (v instanceof Integer) {
                add((Integer) v);
            } else {
                throw new IllegalStateException("Unexpected value: " + v.getClass());  
            }
        }
    }

【讨论】:

  • 这不起作用,结果为error: no suitable method found for add(T)
【解决方案2】:

可以这样写:

void add(Collection<Object> value) {
      for (Object v : value) {
         if(v instanceof Integer){
             add((int)v); 
         }
         else if(v instanceof Boolean){
             add((boolean)v); 
         }
      }
   }

但这看起来并不优雅和漂亮。

【讨论】:

  • 是的,我知道instanceof,但我同意它不是特别优雅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多