2016-03-07 4 views
-2

Я хочу неявно применить свою собственную реализацию интерфейса к функции Java8.Неявный листинг функционального интерфейса

Мой код:

import java.util.stream.Stream; 

@FunctionalInterface 
interface StringChanger { 
    String change(String o); 
} 

public class A { 

    public static void main(String[] args) { 
     Stream.of("hello", "world") 
       .map(new StringChanger() { 

        @Override 
        public String change(String o) { 
         return o.trim(); 
        } 
       }) 
       .forEach(System.out::println); 
    } 
} 

Почему приведение не работает?

Я получаю это исключение:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments (Trimmer) 

    at A.main(A.java:13) 
+0

* «моя реализация интерфейса» * не имеет смысла. Интерфейс не является реализацией по существу. Почему вы хотите иметь 'StringChanger' вместо' UnaryOperator 'и почему это имеет значение? – Tunaki

+1

Ничего себе, вы полностью изменили вопрос, аннулировав все текущие ответы. Это не круто, и я думаю, что он должен быть отменен. Мена и Ченгпохи даже должны были удалить свои ответы в результате этого, поэтому они буквально потеряли время, пытаясь помочь вам! – Tunaki

+0

Давление сверстников заставило меня вернуть мои изменения к этому (часто заниженному) вопросу. Обновленная версия переносится на http://stackoverflow.com/q/35866449/476791. @Tunaki – slartidan

ответ

0

Ну, метод map не ожидает StringChanger реализации. Он ожидает реализацию Function.

Что вы можете сделать, это создать реализацию своего интерфейса StringChanger и передать ссылку метод вашей реализации в map:

StringChanger sc = new StringChanger() { 
    @Override 
    public String change(String o) { 
     return o.trim(); 
    } 
}; 
Stream.of("hello", "world") 
     .map(sc::change) 
     .forEach(System.out::println); 

EDIT:

Для того, чтобы назначить реализацию одного функционального интерфейс к другой ссылке на функциональный интерфейс, вы можете назначить ссылку на метод метода исходного функционального интерфейса:

MyConsumer i3 = i::accept; 
    IntConsumer i4 = i2::doSomething; 
+0

@slartidan Кастинг невозможен, поскольку эти функциональные интерфейсы не принадлежат к иерархии одного и того же типа. Если 'MyConsumer' был под-интерфейсом' IntConsumer', вы могли бы использовать экземпляр 'MyConsumer' для' IntConsumer'. – Eran

Смежные вопросы