【问题标题】:Kotlin: Confusion with lambdas and genericsKotlin:混淆 lambda 和泛型
【发布时间】:2016-09-28 20:18:17
【问题描述】:

请查看 cmets 中的错误消息:

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() 都需要空书/作者
  • printIt() 需要使用其中任何一个功能。

因此,考虑“生产者扩展,消费者超级”,我认为我的问题是我希望输入参数是协变的,而当它被硬编码为逆变(“in”)时。

我的这个想法没有奏效:

// Unresolved reference: KFunction1
// --------------vvvvvvvvvv
fun htmlList2(f: KFunction1<Printable?,String>, a:Printable):String {
    return "Unknown: " + f.invoke(null) +
            "Known: " + f.invoke(a)
}

【问题讨论】:

    标签: function types kotlin signature generic-variance


    【解决方案1】:

    我认为这是正确的:

    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"))
    }
    

    感谢在Generic Constraints: Upper Bounds 上尝试和阅读文档

    如果有更好的方法仍然感兴趣......

    【讨论】:

    • 这是正确的做法。编译器基本上发现了你一个错误
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2012-09-13
    • 2011-11-04
    相关资源
    最近更新 更多