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

时间:2021-05-21 23:36:23

标签: scala

我有一个单例 Banana 类,并希望避免将 .type 后缀添加到它的所有用法中,所以我这样定义它:

sealed trait Banana
case object Banana extends Banana

现在我可以拥有干净的方法签名,例如 def peel(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

现在在上面,res0Banana.type 类型,这不是我要找的类型! banana 另一方面,确实是我想要的类型。是否有可能获得 latter 类型的香蕉 literal 而不先将其分配给值?

显然 Banana.asInstanceOf[Banana] 有效,但绕过了整个令人讨厌的“编译时安全”问题。

1 个答案:

答案 0 :(得分:5)

意识到这是有效的:

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

一开始就使用你的hack要好得多。

如果您确实使用了 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
相关问题