gpt4 book ai didi

scala - 为什么不能重载无参数方法,对于隐式类

转载 作者:行者123 更新时间:2023-12-04 07:32:51 26 4
gpt4 key购买 nike

我尝试重载对象 World 中的方法使用隐式
类(class)世界

class World {
}

object World {

implicit class WithWorld(_world: World) {
def world(): Unit = println("world")
}

implicit class WithWorld2(_world: World) {
def world(i: List[Int]): Unit = println("list Int")
}

implicit class WithWorld3(_world: World) {
def world(i: List[String]): Unit = println("list String")
}


}

//测试
val world = new World()

//这是对的
world.world(List(1))
world.world(List("string"))

//但是这个 world.world() ,我得到一个编译错误
Error:(36, 5) type mismatch;
found : world.type (with underlying type World)
required: ?{def world: ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method WithWorld in object World of type (_world: World)World.WithWorld
and method WithWorld2 in object World of type (_world: World)World.WithWorld2
are possible conversion functions from world.type to ?{def world: ?}
world.world()
^

最佳答案

看起来像一个错误,但很难说。通常,您会在一个隐式类中定义所有这些方法。但是随后您遇到了错误,其中两种方法都接受 List有相同的删除,编译器不会允许它。但是,您可以使用 DummyImplicit 解决这个问题。 :

class World

object World {

implicit class WithWorld(_world: World) {
def world(): Unit = println("world")
def world(i: List[Int]): Unit = println("list Int")
def world(i: List[String])(implicit d: DummyImplicit): Unit = println("list String")
}

}

scala> val world = new World
world: World = World@4afcd809

scala> world.world()
world

scala> world.world(List(1, 2, 3))
list Int

scala> world.world(List("a", "b", "c"))
list String

方法重载通常会在某些时候导致痛苦和痛苦。

关于scala - 为什么不能重载无参数方法,对于隐式类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34977005/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com