Scala 是否将事例对象文字声明为其父类型?
我有一个singletonScala 是否将事例对象文字声明为其父类型?,scala,Scala,我有一个singletonBanana类,希望避免对其所有用法进行postfixed.type,因此我将其定义为: sealed trait Banana case object Banana extends Banana 现在我可以拥有干净的方法签名,比如defpeel(foo:String):Banana 不过有一个小麻烦-我很难引用case对象Banana,同时希望它实际上是父类型。注意: scala> sealed trait Banana; case object Banana
Banana
类,希望避免对其所有用法进行postfixed.type
,因此我将其定义为:
sealed trait Banana
case object Banana extends Banana
现在我可以拥有干净的方法签名,比如defpeel(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.asInstanceOf[Banana]
是有效的,但它回避了整个令人讨厌的“编译时安全”问题。意识到这是有效的:
type Banana = Banana.type
object Banana {
// ...
}
最好一开始就不要使用你的黑客技能
如果使用hack,请注意expr:Type
是一个表达式(称为类型归属):
Banana.type
是Banana
的一个子类型,所以它不重要。不是这样的-我在EitherT
中处理这些类型,这对于理解来说是不协变的,所以当它需要Banana
时给它一个Banana.type
是一个编译错误:/你有加宽
对于这一点,你也可以在使用站点上做一个简单的向上投射。我更愿意首先直接给EitherT
正确的类型,而不是以后再加宽它,但是你所说的“简单向上投射”是什么意思呢?EitherT.leftT[F,a](香蕉:香蕉)
,也许如果返回类型是显式的,编译器将能够为您进行向上转换(不确定是哪一种)。啊,我需要的是Banana:Banana
!我确实忘记了那其实是它自己的表达。不过,我必须尝试一下类型别名,它似乎可以让我从一开始就消除这种类型按摩。事实上,类型别名可以更好地解决这个问题!非常感谢@HTNW。
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