我是科特林·纽比。我有一组函数,它们接受和解析不同的输入(纯文本、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
函数,代码似乎可以正确构建和工作。
为什么?为什么问题似乎只影响(字符串)-
原因是函数的输入类型是(即,它有约束,但约束未知)。无法调用具有星形投影输入类型的函数。从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表中返回一些字段(