繁体   English   中英

接受任何有合适方法的类型

[英]Accept any type for which there's a suitable method

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

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

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

现在我想用一个额外的add方法来扩展这个 class ,它需要一个Collection<..> 但是, 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<..>的方式是:

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

非常感谢。

- - 编辑 - -

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

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

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

您可以声明通用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());  
            }
        }
    }

可以这样写:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM