2016-05-02 3 views
3

У меня есть массив методов, которые можно вызывать и нуждаться в булевом параметре. Я попытался это:Java: возвращаемый массив функций

public class Example { 
    public Function<Boolean, Integer> getFunctions(boolean t) { 
     return new Function[] { 
      this::magicNumber 
     }; 
    } 

    public int magicNumber(boolean t) { 
     return (t) ? new Random().nextInt(11) : 0; 
    } 
} 

Но тогда компилятор выдает сообщение об ошибке с сообщением

Incompatible types: invalid method reference 
    Incompatible types: Object cannot be converted to boolean 

В приведенном выше примере, однако, может работать, сохраняя функции в переменной и возвращения, однако я дон Не находите этот чистый код и он лишний.

public class Example { 
    public Function<Boolean, Integer> getFunctions(boolean t) { 
     Function<Boolean, Integer> f = this::magicNumber; 

     return new Function[] { 
      f 
     }; 
    } 

    public int magicNumber(boolean t) { 
     return (t) ? new Random().nextInt(11) : 0; 
    } 
} 

Есть ли способ сократить код выше, как в примере в начале?

EDIT

Как запрошен комментатор, я дам краткий пример того, как я Поставщик в предыдущем проекте. Я возвращаю их в массив для возврата объектов. Проблема в том, что этот проект зависит от наличия параметра.

public Supplier<T>[] getRecipes() 
{ 
    return new Supplier[] { 
     this::anchovyRule, 
     this::codRule, 
     this::herringRule, 
     this::lobsterRule, 
     this::mackerelRule, 
     this::pikeRule, 
     this::salmonRule, 
     this::sardineRule, 
     this::shrimpRule, 
     this::troutRule, 
     this::tunaRule 
    }; 
} 
+0

Я бы хотел, чтобы ваши примеры были скомпилированы в первую очередь. Почему вы игнорируете 't' в' getFunctions'? –

+0

@Tunaki Я хочу вернуть массив функций, как я продемонстрировал в первом блоке кода. – DevNebulae

+1

@ GamerNebulae, как показывает Tunaki, массивы и дженерики не очень хорошо смешиваются. Если не существует конкретной причины, по которой он должен быть массивом, вместо этого используйте коллекцию, такую ​​как «List >». – Jesper

ответ

3

Как насчет возвращения List<Function<Boolean, Integer>>, как это.

public class Example { 
    public List<Function<Boolean, Integer>> getFunctions(boolean t) { 
     return Arrays.asList(
      this::magicNumber 
     ); 
    } 

    public int magicNumber(boolean t) { 
     return (t) ? new Random().nextInt(11) : 0; 
    } 
} 
Смежные вопросы