2016-09-28 8 views
2

Для того, чтобы проверить сочинить() и andThen() методы funtional интерфейса функции я сделал простой код:Возврат объекта при использовании сочинить() или andThen() от функции <V, R>

public class Test {  
    public Trans testCompose() { 
     return new T1().compose(new T2()); 
    } 
} 

interface Trans extends Function<File, File> { 
} 

class T1 implements Trans { 
    @Override 
    public File apply(File file) { 
     return null; 
    } 
} 

class T2 implements Trans { 
    @Override 
    public File apply(File file) { 
     return null; 
    } 
} 

Но как вы можете видеть, что этот код не будет компилироваться. Данная причина: экземпляр типа (v) V не существует, поэтому функция соответствует Trans.

multiple subjects о различиях расширений и супер в подстановочных знаках Я понимаю их использование в списке, но не совсем уверен, почему он не может скомпилироваться здесь.

Есть ли способ сохранить объект Trans в методе testCompose() или он обязательно должен возвращать функцию, чтобы компилировать код?

ответ

4

Нет, этот код является неправильным. Объект, возвращаемый testCompose(), не реализует Trans; это анонимный тип лямбда-помощника и не может быть отброшен до Trans.

Метод testCompose() должен быть объявлен как возвращаемый Function<File, File>, так как это единственный реализованный интерфейс.