Issue with compiler recognising a functional interface?
Paul Sandoz
paul.sandoz at oracle.com
Thu Nov 8 02:42:35 PST 2012
Hi,
I am running into an issue with the compiler with latest code.
See end of email for all relevant interfaces.
The compiler fails for:
IntInfiniteIterator iterator = () -> t;
[javac] /Users/sandoz/Projects/jdk8/lambda/jdk/src/share/classes/java/util/streams/primitives/Primitives.java:282: error: incompatible types: the target type must be a functional interface
[javac] IntInfiniteIterator iterator = () -> t;
But works for:
InfiniteIterator<T> iterator = () -> t;
I would of expected the former to work since there is just one non-default method.
Paul.
interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEach(Block<? super E> block) {
while (hasNext())
block.apply(next());
}
}
interface InfiniteIterator<T> extends Iterator<T> {
@Override
public default boolean hasNext() {
return true;
}
}
interface IntIterator extends Iterator<Integer> {
// Iterator<Integer>
@Override
default Integer next() {
Logger.getLogger(getClass().getName()).log(Level.WARNING, "{0} using boxed int", getClass().getName());
return nextInt();
}
@Override
default void forEach(Block<? super Integer> sink) {
if (sink instanceof IntBlock) {
forEach((IntBlock) sink);
}
else {
Iterator.super.forEach(sink);
}
}
//
int nextInt();
default void forEach(IntBlock sink) {
while (hasNext()) {
sink.applyInt(nextInt());
}
}
}
interface IntInfiniteIterator extends IntIterator {
@Override
default boolean hasNext() {
return true;
}
}
More information about the lambda-dev
mailing list