2016-12-16 3 views
0

Я реплицировал ошибку, с которой столкнулся при использовании Java 8 @FunctionalInterface (eclipse). Не компилируется следующее: Refined производит ошибку:Ошибка переопределения метода и функционального интерфейса

@FunctionalInterface 
interface Functioner<TFunnel, TFan> { 
    Function<TFunnel, TFan> funnelledThenFanned(); 
} 

@FunctionalInterface 
interface Receiver<T, TFan> 
extends Functioner<Supplier<? extends T>, TFan> {} 

@FunctionalInterface 
interface Giver<TFunnel, T> 
extends Functioner<TFunnel, Supplier<T>> {} 

@FunctionalInterface 
interface Refined<T, R> 
extends Function<T, R>, Receiver<T, Supplier<R>>, Giver<Supplier<? extends T>, R> { 

    @Override 
    public abstract R apply(T arg); 

    @Override 
    public default Function<Supplier<? extends T>, Supplier<R>> funnelledThenFanned() { 
     ... 
    } 

} 

Refined расширение всех Function, Receiver и Giver вызывает ошибку; удалите любой из них, и код компилируется. Это правильное поведение? Если да, то как я могу/должен рефакторировать?

UPDATE

Это, кажется, производит подобную ошибку:

@FunctionalInterface 
interface Another<TFunnel, T> 
extends Functioner<TFunnel, Supplier<T>>, Giver<TFunnel, T> { 

    public abstract void newMethod(); 

    @Override 
    public default Function<TFunnel, Supplier<T>> funnelledThenFanned() { 
     ... 
    } 

} 

Кроме того, отмечу, что без @FunctionalInterface все компилирует; интерфейсные экземпляры просто не могут быть выражены как лямбда.

+0

Какая конкретная ошибка вы видите? –

+0

Предоставленный код компилируется без каких-либо ошибок. – gr7

+0

@ marcus.ramsden ** Недопустимая аннотация «@FunctionalInterface»; Refined не является функциональным интерфейсом. ** В ошибке компилятора указано, что интерфейсы 'Refined' и' Another' не являются функциональными интерфейсами. Я не могу использовать lambdas, а аннотация @FunctionalInterface вызывает ошибку компиляции. – bizness86

ответ

0

Это был Eclipse bug 453552, который был исправлен с 4.6M1, поэтому любой релиз Neon (в настоящее время Neon.1, скорее Neon.2) содержит исправление.

1

Functioner имеет абстрактный метод funnelledThenFanned() и Another добавляет newMethod(), что делает абстрактные методы, что превышает предел введенной @FunctionalInterface.

Здесь нет никакой тайны.

+1

'Another' также определяет' funnelledThenFanned() ', который оставляет' newMethod() 'как единственный абстрактный метод. – bizness86

0

Переключение с Eclipse Mars на кислород решило эту проблему. Спасибо.

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