我有以下课程
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成员。
答案 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>
。