0
との混同がコメントでエラーメッセージを参照してください。Kotlin:ラムダとジェネリック
interface Printable {}
class Book(val title: String) :Printable
fun bookPrint(b: Book?):String = "Title: " + b?.title
class Author(val name: String) :Printable
fun authorPrint(a: Author?):String = "Name: " + a?.name
// Unsupported: [modifier on parameter in function type]
// -------------vv
fun printIt(f: (in Printable?) -> String, a:Printable):String {
return "Unknown: " + f.invoke(null) +
"Known: " + f.invoke(a)
}
fun main(args: Array<String>) {
// Type Mismatch:
// Required: (Printable?) -> String
// Found: KFunction1<Book?,String>
// -------vvvvvvvvv
printIt(::bookPrint, Book("Storm Front"))
// -------vvvvvvvvvvv
printIt(::authorPrint, Author("Jim Butcher"))
}
キーポイント:
bookPrint()
とauthorPrint()
の両方がnull書籍/著者にprintIt()
ニーズを取る必要がありますこれらの機能のいずれかを利用することができます。
「プロデューサー・エクステンション・コンシューマー・スーパー」と考えると、入力パラメータが反変(「in」)にハードコードされている場合、入力パラメーターを共変変数にしたいと思っています。
私は動作しませんでしたこのアイデアを持っていた:
// Unresolved reference: KFunction1
// --------------vvvvvvvvvv
fun htmlList2(f: KFunction1<Printable?,String>, a:Printable):String {
return "Unknown: " + f.invoke(null) +
"Known: " + f.invoke(a)
}
これは正しい方法です。コンパイラがあなたにバグを見つけました。 – voddan