【问题标题】:Scala Overloaded Method resolution issue. How to get the compiler to select the right method? [duplicate]Scala 重载方法解决问题。如何让编译器选择正确的方法? [复制]
【发布时间】:2014-02-10 14:06:01
【问题描述】:
[error] both method addVertex in class OrientBaseGraph of type (x$1: Any, x$2: <repeated...>[Object])com.tinkerpop.blueprints.impls.orient.OrientVertex
[error] and  method addVertex in class OrientBaseGraph of type (x$1: Any)com.tinkerpop.blueprints.impls.orient.OrientVertex
[error] match argument types (String)
[error]         val npNode = g.addVertex(f"class:$NPPhrase")
[error]

如何让 Scala 选择我尝试调用的方法(更具体的方法)?

哦,虽然在这种情况下g.addVertext(...,Nil) 在语义上是等价的,但我仍然想知道如何解决上述问题。

【问题讨论】:

  • 请出示密码!
  • 你会用代码做什么?它只是一个以字符串为输入的方法。好吧,也许你需要看看NPPhrase 是什么:def NPPhrase = "NPChunkPhrase"
  • 干杯,有一个明智的答案(创建一个 java 消歧类")。投票结束。

标签: scala overloading


【解决方案1】:

编译器会告诉你正确的事情。

addVertex(f"class:$NPPhrase") 匹配 addVertex(Any)addVertex(x$1: Any, x$2: Any*)。 发生这种情况是因为x$2 参数可能为空,您可以在调用addVertex(x$1: Any, x$2: Any*) 时省略它(如addVertex("whatever")

选项有:

  1. 重命名方法之一。
  2. addVertex(x$1: Any, x$2: Any*)签名更改为addVertex(x$1: Any, x$2: Any, x$3: Any*),以便它只处理带有2个或更多参数的调用。 (我假设您的 addVertex(x$1: Any)addVertex(x$1: Any, x$2: Any*) 对于一个参数的行为相同)

【讨论】:

  • 是的:/但我无权访问该代码。它是 OrientDB 的一部分。 Scala 肯定有一些机制来处理遗留代码?
  • 嗯,这确实是一个很好的观察结果。我想您正在使用某种 Java 库用于 OrientDB。问题是 Scala 将其视为编译错误,原因很明显(它无法自行选择调用哪个方法),但 Java 只是在没有可变参数的情况下运行该方法,甚至没有抱怨。
  • 这似乎是一个已知问题。请阅读:stackoverflow.com/questions/3313929/…
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多