问题
I want to implicitly cast my own interface implementation to a Java8 function.
My code:
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);
}
}
Why does the cast not work?
I'm getting this exception:
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)
回答1:
Well, the map method doesn't expect a StringChanger implementation. It expects a Function implementation.
What you can do is create an implementation of your StringChanger interface, and pass a method reference of your implementation to 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:
In order to assign an implementation of one functional interface to a different functional interface reference, you can assign a method reference of the source functional interface's method :
MyConsumer i3 = i::accept;
IntConsumer i4 = i2::doSomething;
来源:https://stackoverflow.com/questions/35845888/implicit-cast-of-functional-interface