Примите любой тип, для которого есть подходящий метод - PullRequest
0 голосов
/ 02 мая 2020

У меня есть класс 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<..> таким образом, что:

«Принять коллекцию, в которой ее внутренний тип имеет подходящий add метод»

Большое спасибо.

--- EDIT ---

Единственное жизнеспособное решение, которое можно найти, это:

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

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

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Вы можете объявить родовой c 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());  
            }
        }
    }
0 голосов
/ 02 мая 2020

Можно написать что-то вроде:

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

, но это не выглядит элегантно и красиво.

...