具有替代方法的重载方法值

Posted

技术标签:

【中文标题】具有替代方法的重载方法值【英文标题】:Overloaded method value with alternatives 【发布时间】:2014-04-19 10:12:12 【问题描述】:

我有以下几点:

def calc(dir: File): Option[Group] = 
 calcModel(dir) match 
  case Some(model: Model) => calcUI(model, centerpane.getWidth, centerpane.getHeight, 5, MAX_LEVEL)
  case None =>               None
 


def calcUI(model: Model, availableWidth: Double, availableHeight: Double, maxLevel: Int): Option[Group] = 


def calcUI(model: Model, posX: Double, posY: Double, availableWidth: Double, availableHeight: Double, horizontally: Boolean, startLevel: Int, maxLevel: Int): Option[Group] = 


protected def calcUI(node: Node, posX: Double, posY: Double, availableWidth: Double, availableHeight: Double, horizontally: Boolean, level: Int, maxLevel: Int): Group = 


def calcModel(dir: File): Option[Model] = 

(备注:模型不是从Node派生的)

并得到以下编译器错误消息:

Error:(88, 27) overloaded method value calcUI with alternatives:
  (node: org.rob.spaceview.modell.Node,posX: Double,posY: Double,availableWidth: Double,availableHeight: Double,horizontally: Boolean,level: Int,maxLevel: Int)javafx.scene.Group <and>
  (model: org.rob.spaceview.modell.Model,posX: Double,posY: Double,availableWidth: Double,availableHeight: Double,horizontally: Boolean,startLevel: Int,maxLevel: Int)Option[javafx.scene.Group] <and>
  (model: org.rob.spaceview.modell.Model,availableWidth: Double,availableHeight: Double,maxLevel: Int)Option[javafx.scene.Group]
 cannot be applied to (org.rob.spaceview.modell.Model, Double, Double, Int, Int)
      case Some(model) => calcUI(model, centerpane.getWidth, centerpane.getHeight, 5, MAX_LEVEL)
                      ^

我不明白。所有 calcUI 函数的参数不同。

我知道这个错误,而且大部分时间我都会得到它并修复它。但是在这里,没有任何线索。

希望有人启发我。谢谢。

【问题讨论】:

我也不明白。您希望选择哪种方法?您使用五个参数。你知道重载是邪恶的,对吧?至少,除非你知道自己在做什么? 重载是邪恶的?我想说重载是 Java/Scala 的一个非常有用和重要的方面。 查看下面的答案和我的评论。真丢人。 @Keppil 例如***.com/q/2510108/1296806 或谷歌。另外,如果您不使用@,我无法回复。即使它是必要的邪恶(有争议),仍然是邪恶的。 @som:有趣的链接,谢谢。 【参考方案1】:

其实调用中给定的参数

case Some(model) => calcUI(model, centerpane.getWidth, centerpane.getHeight, 5, MAX_LEVEL)

不对应任何定义的calcUI 方法。例如对于以下定义

def calcUI(model: Model, availableWidth: Double, availableHeight: Double, maxLevel: Int): Option[Group]

你有一个比需要的参数。

【讨论】:

天哪,这太尴尬了。你是对的,最明显的问题我没有看到。为我感到羞耻。感谢您为我计算正确... 尴尬,但也是一个有用的数据点,说明为什么最好避免重载。即使对于明显的情况,人们也会感到困惑。 这可能发生在我们最好的人身上。我有点同意@som-snytt 关于重载的观点。您可以接受答案以将问题标记为已解决。 这是一个很好的答案,因为我遇到了同样的问题,只有在阅读答案后才算!

以上是关于具有替代方法的重载方法值的主要内容,如果未能解决你的问题,请参考以下文章

带有替代方法的重载方法值选择

如何使用替代方法解决重载方法值寄存器,UDF Spark scala

错误重载方法值 regexp_replace 与替代品

scala.collection.immutable.Iterable[org.apache.spark.sql.Row] 到 DataFrame ?错误:使用替代方法重载了方法值 createDat

为啥不调用具有 const 引用返回值的重载方法?

Scala:方法的多个重载替代方案