我有一个单例 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
是 Banana.type
类型,这不是我要找的类型! banana
另一方面,确实是我想要的类型。是否有可能获得 latter 类型的香蕉 literal 而不先将其分配给值?
显然 Banana.asInstanceOf[Banana]
有效,但绕过了整个令人讨厌的“编译时安全”问题。
答案 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