Java 8:Lambda函数和通用通配符

Abr*_*iel 8 java lambda java-8

我有以下课程

class Book implement Borrowable  {
    @Override
    public String toString(Function<? extends Borrowable
                            , String> format) {
          return format.apply(this);    
    }
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,我无法在此(Book对象)上使用"apply".

我目前的格式化程序是

 Function<Book, String> REGULAR_FORMAT = book -> "name='" + book.name + '\'' +
        ", author='" + book.author + '\'' +
        ", year=" + book.year;
Run Code Online (Sandbox Code Playgroud)

我不想制作该类型的lambda函数

Function<Borrowable, String>
Run Code Online (Sandbox Code Playgroud)

因为我将无法访问未被Borrowable公开的Book成员.

Tag*_*eev 8

Function<? extends Borrowable, String>型手段的功能能够接受某种类型的延伸Borrowable.这并不意味着它接受Book.可能最好的解决方案是引入通用参数Borrowable:

public interface Borrowable<T> {
    public String toString(Function<? super T, String> format);
}
Run Code Online (Sandbox Code Playgroud)

并在Book以下位置指定:

public class Book implements Borrowable<Book> {
    @Override
    public String toString(Function<? super Book, String> format) {
        return format.apply(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

它类似于Comparable界面的工作方式.


use*_*751 5

您可能正在寻找Function<? super Book, String>.

AFunction<Book, String>是有效的Function<? extends Borrowable, String>,但 a 也是有效的Function<DVD, String>。您的方法 ( toString) 可能会使用 a 进行调用Function<DVD, String>,但您无法传递this给该方法,因为this它不是 a DVD

Function<? super Book, String>也许将参数类型更改为。