gpt4 book ai didi

scala - 将 case 对象字面量声明为其父类型?

转载 作者:行者123 更新时间:2023-12-02 02:11:54 24 4
gpt4 key购买 nike

我有一个单例 Banana 类,并且希望避免将 .type 后缀到其所有用法,因此我将其定义如下:

sealed trait Banana
case object Banana extends Banana

现在我可以拥有干净的方法签名,例如 defpeel(foo: String): Banana

不过有一个小烦恼 - 我很难引用 case 对象 Banana,同时希望它实际上是父类型。观察:

scala> sealed trait Banana; case object Banana extends Banana
trait Banana
object Banana

scala> Banana
val res0: Banana.type = Banana

scala> val banana: Banana = Banana
val banana: Banana = Banana

在上面,res0 的类型是 Banana.type,这不是我要找的类型!另一方面,banana确实是我想要的类型。是否有可能获得 后者 类型的香蕉文字,而无需先将其分配给值?

显然 Banana.asInstanceOf[Banana] 可以工作,但绕过了整个讨厌的“编译时安全”问题。

最佳答案

意识到这有效:

type Banana = Banana.type
object Banana {
// ...
}

最好一开始就使用你的黑客技术。

如果您确实使用了 hack,请注意 expr: Type 是一个表达式(称为类型归属):

sealed trait Banana; case object Banana extends Banana
def f[T](x: T)(implicit eq: T =:= Banana): T = x
// f(Banana) // tries to call with T = Banana.type, fails
f(Banana: Banana) // calls f with the right T = Banana instead of T = Banana.type

关于scala - 将 case 对象字面量声明为其父类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67644850/

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