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

问题描述 投票:0回答:1

我有班级 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). I 明白 何以 这样做是行不通的。所以我的问题是,我如何指定 Collection<..> 以这样的方式说

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

谢谢你

---编辑 ---

发现唯一可行的解决办法是这样做。

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

   void addBooleans(Collection<Boolean> value) {
      for (Boolean v : value) {
         add(v);
      }
   }
java generics operator-overloading type-bounds
1个回答
2
投票

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

-1
投票

可以写成这样

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

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

© www.soinside.com 2019 - 2024. All rights reserved.