将case对象文字声明为其父类型?
我有一个单例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
现在在上面,res0是 type 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