Scala中使用Foo.type指定Case Object在Either中的类型是否正确?
关于Scala中case object与Either类型参数的问题解释
嘿,这个问题其实戳中了Scala里单例对象的核心类型机制,我来给你掰扯清楚:
首先得明确case object的类型本质:当你写case object Foo时,Foo并不是一个类型,而是这个单例对象的实例名称。它对应的真正类型是Foo.type——这是Scala专为单例对象设计的「单例类型(singleton type)」,用来标识“只有Foo这一个实例的类型”。
然后看Either的要求:Either是泛型类型,它的两个参数必须是合法的类型。当你尝试写Either[Foo, B]时,编译器会去查找名为Foo的类型,但这里的Foo只是个实例,不是类型,自然会报“无法找到Foo”的编译错误。
而Either[Foo.type, B]就是完全正确的写法:你给Either传入了两个合法的类型参数——左边是Foo这个单例对应的单例类型Foo.type,右边是B类型,编译器能正确识别,所以可以正常编译。
给你补个实际代码例子更直观:
case object Foo type B = String // ❌ 编译错误:找不到类型 Foo // val invalid: Either[Foo, B] = Left(Foo) // ✅ 完全正常编译 val valid: Either[Foo.type, B] = Left(Foo)
如果觉得Foo.type写起来有点啰嗦,也可以给它起个别名简化:
type FooSingleton = Foo.type val valid: Either[FooSingleton, B] = Left(Foo)
内容的提问来源于stack exchange,提问作者Mojo
相关产品推荐
相关产品推荐

