代码之家  ›  专栏  ›  技术社区  ›  Cory Klein

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

  •  0
  • Cory Klein  · 技术社区  · 3 年前

    我有个独生子女 Banana 类并希望避免后期修复 .type

    sealed trait Banana
    case object Banana extends Banana
    

    现在我可以有干净的方法签名,比如 def peel(foo: String): Banana

    不过有一个小麻烦-我很难提到 case对象 同时希望它实际上是父类型。观察:

    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] 工作,但围绕整个讨厌的“编译时安全”的事情。

    1 回复  |  直到 3 年前
        1
  •  2
  •   HTNW    3 年前

    认识到这是可行的:

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

    最好只是

    如果你真的使用了黑客,请注意 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