首页 > 解决方案 > 接受任何有合适方法的类型

问题描述

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

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

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

现在我想用一个额外的add方法来扩展这个类,它需要一个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);
      }
   }

标签: javagenericsoperator-overloadingtype-bounds

解决方案


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());  
            }
        }
    }

推荐阅读