我有一个单例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实际上是我想要的类型。如果不首先将其赋值给值,是否有可能得到后一种类型的香蕉文本?
显然,Banana.asInstanceOf[Banana]可以工作,但却绕开了整个烦人的“编译时安全性”的问题。
发布于 2021-05-21 23:56:26
认识到这是可行的:
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.typehttps://stackoverflow.com/questions/67644850
复制相似问题