当前位置: 首页 > 知识库问答 >
问题:

在向外投影的函数对象上调用()

孙洋
2023-03-14

我是科特林·纽比。我有一组函数,它们接受和解析不同的输入(纯文本、json、xml),但具有相同的输出(和事件实例)。代码如下所示(完整版本见https://pastebin.com/UNJFGZsm):

    data class Event(val id: Int)
    val stringToEvent: (String) -> Event = { s -> Event(s.toInt()) }
    val dummyToEvent: (Document) -> Event = { _ -> Event(1) }
    val jsonToEvent: (JsonNode) -> Event = { j -> Event(j.get("id").asInt()) }
    fun elementGen(opt: String): Any {
        // return a String, or a JsonNode, or a Document
        // ...
    }
    fun main(args : Array) {

        val parser = when (args[0]) {
            "string" -> stringToEvent  // it builds if I remove this line
            "json" -> jsonToEvent
            "xml" -> dummyToEvent
            else -> throw RuntimeException("Option not supported")
        }

        print(parser(elementGen(args[0])))
    }

当我尝试构建时,会出现如下错误:

(44,11):外投影类型“功能1”

但是,如果我不使用stringToEvent函数,代码似乎可以正确构建和工作。

为什么?为什么问题似乎只影响(字符串)-


共有1个答案

微生运浩
2023-03-14

原因是函数的输入类型是(即,它有约束,但约束未知)。无法调用具有星形投影输入类型的函数。从Kotlin泛型页面:

给富的

提供的参数(elementGen(args[0]))的类型是Any。这是因为when子句中可能的参数类型的并集在Any下没有公共类型。因此,elementGen(args[0])是函数的无效参数

奇怪的是,尽管kotlinc能够在原始代码中检测到这个错误,但当字符串输入类型被删除时,它却无法检测到。奇怪的是,在这种情况下编译成功了。假设参数类型(Any)不满足输入类型(交叉点类型文档)

fun elementGen(opt: String): Any {
    return when (opt) {
        "string" -> "1"
        "json" -> {
            "1"
//            val mapper = ObjectMapper()
//            mapper.readTree("{\"id\": 1 }")
        }
        "xml" -> {
            DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("<id>1</id>")
        }
        else -> throw RuntimeException("Option not supported")
    }
}

fun main(args: Array<String>) {

    val parser = when (args[0]) {
//        "string" -> stringToEvent
        "json" -> jsonToEvent
        "xml" -> dummyToEvent
        else -> throw RuntimeException("Option not supported")
    }
    print(parser(elementGen(args[0])))
}

您可以看到编译仍然成功,但在运行时引发了类强制转换异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to com.fasterxml.jackson.databind.JsonNode
    at com.example.demo.config.TestKt$jsonToEvent$1.invoke(test.kt)
    at com.example.demo.config.TestKt.main(test.kt:39)

我想你可能发现了一个错误。如果您选择添加票证,问题跟踪器就在这里。

 类似资料:
  • 问题内容: 因此,我正在重构代码以实现更多的OOP。我设置了一个类来保存页面属性。 稍后,我像这样调用set_page_title()函数 当我收到错误消息时: 调用非对象上的成员函数set_page_title() 那我想念什么呢? 问题答案: 这意味着它不是对象的实例。我们可以看到您用来初始化变量的代码吗? 当您期望特定的对象类型时,还可以使用PHP的类型提示功能 Docs 在违反逻辑时得到错

  • 问题内容: 我正在尝试在此准备好的语句中绑定变量,但我一直收到错误: 调用该函数,并将变量传递给它。当我更改函数以仅回显变量时,该变量会在页面上正常打印,但是如果我尝试在此处绑定它,则会收到错误。有人可以帮忙吗? 我知道函数没有完全写在这里,但这不应该是一个问题。我不明白为什么我会收到此错误。 问题答案: 正如错误消息所说,这似乎不是一个对象。尝试在您的prepare- call之后使用来调试它。

  • 问题内容: 我的查询有问题。我最近改用了PDO,这对我来说是新的。现在,我需要在查询中使用JOIN来从另一个表中获取数据,而无需执行两次执行。 问题是,我收到此错误: 我不明白问题是什么。这是我的代码的样子: 或简称为查询: 我想要的是,从用户ID为session且请求为0的朋友那里获取所有行。但是然后我想获取用户中那些朋友的ID,以便我可以链接到他们的个人资料。注意 感谢您提供任何反馈意见,不必

  • 问题内容: 此代码 出现错误 : 致命错误:在第42行的C:\ Users \ fel \ VertrigoServ \ www \ login \ validation.php中的非对象上调用成员函数prepare() 码: 可能的原因是什么? 另一个问题 是什么?抱歉,我是pdo的新手 问题答案: 未定义。您没有在函数内部声明它,也没有将其作为参数传递。 您需要将其传递(好),或在全局名称空间

  • 更新1:根据建议添加了打印“this”。 更新2:拆分成几个文件,尝试阻止gcc优化。 更新3:记录复制构造函数并输入添加函数。 更新4:在main中添加了Clang和第二个cout的输出。 我希望参数析构函数作为函数中的最后一条语句被调用。从今以后,我希望下面的代码能够提供以下输出。 使用MSVC(Visual Studio)时,输出与预期的一样。但GCC(4.8.2-19ubuntu1)输出以

  • 我已经为此挣扎了好几天了。我们刚刚开始与mongoDB合作,因此我对它的了解非常有限。 总之,我想做的是:我们有一个叫做Loan的课程,就像这样: 由于查询此集合时必须执行各种操作,因此我们在LoanRepository中创建了一个聚合(该聚合适用于我们在Mongo Compass中创建的,然后将其导出到我们的代码中): 这个想法是,在所有上述操作之后,我们只需要从整个Loans表中返回一些字段(