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

时间:2015-06-13 13:05:14

标签: java lambda java-8

我有以下课程

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

这给了我一个错误,我不能在此(Book对象)上使用“apply”。

我当前的格式化程序是

 Function<Book, String> REGULAR_FORMAT = book -> "name='" + book.name + '\'' +
        ", author='" + book.author + '\'' +
        ", year=" + book.year;

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

Function<Borrowable, String>

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

2 个答案:

答案 0 :(得分:7)

Function<? extends Borrowable, String>类型表示能够接受扩展Borrowable某些类型的函数。这并不意味着它接受Book。可能最好的解决方案是引入Borrowable的通用参数:

public interface Borrowable<T> {
    public String toString(Function<? super T, String> format);
}

并在Book中指定:

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

它与Comparable界面的工作方式类似。

答案 1 :(得分:2)

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

Function<Book, String>是有效Function<? extends Borrowable, String>,但Function<DVD, String>也是如此。您的方法(toString)可能会被Function<DVD, String>调用,由于this不是this,因此您无法通过DVD

可能将参数类型更改为Function<? super Book, String>