Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 是否将事例对象文字声明为其父类型?_Scala - Fatal编程技术网

Scala 是否将事例对象文字声明为其父类型?

Scala 是否将事例对象文字声明为其父类型?,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

我有一个singleton
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