2016-05-31 22 views
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) 
} 

答えて

2

私はこれが正しいと思う:Generic Constraints: Upper Bounds

上のドキュメントを実験し、読みに

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 

// Add type parameter T, upper-bounded by Printable. This ties 
// the type of the first argument to the type of the second and 
// ensures they are both Printable. 
fun <T:Printable> printIt(f: (T?) -> String, a:T):String { 
    return "Unknown: " + f.invoke(null) + 
      "Known: " + f.invoke(a) 
} 

fun main(args: Array<String>) { 
    printIt(::bookPrint, Book("Storm Front")) 
    printIt(::authorPrint, Author("Jim Butcher")) 
} 

感謝をまだ興味があればより良い方法があります...

+1

これは正しい方法です。コンパイラがあなたにバグを見つけました。 – voddan

関連する問題