首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合类型的Case类伴随对象生成错误

复合类型的Case类伴随对象生成错误
EN

Stack Overflow用户
提问于 2013-11-20 11:28:01
回答 2查看 836关注 0票数 10

定义的空特性测试:

代码语言:javascript
复制
trait Test

复合类型中使用的:

代码语言:javascript
复制
scala> val a : Int with Test = 10.asInstanceOf[Int with Test]
a: Int with Test = 10

和带有复合类型参数的case类(类似于未装箱的标记类型):

代码语言:javascript
复制
scala> case class Foo(a: Int with Test)
error: type mismatch;
 found   : Double
 required: AnyRef
Note: an implicit exists from scala.Double => java.lang.Double, but
methods inherited from Object are rendered ambiguous.  This is to avoid
a blanket implicit which would convert any scala.Double to any AnyRef.
You may wish to use a type ascription: `x: java.lang.Double`.

但它完全适用于:

代码语言:javascript
复制
scala> case class Foo(a: List[Int] with Test)
defined class Foo

方法定义也没有问题:

代码语言:javascript
复制
scala> def foo(a: Int with Test) = ???
foo: (a: Int with Test)Nothing

Scala版本2.10.3

这是正常的编译器行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-22 14:32:39

您遇到了一种情况,Scala试图统一原语和对象的尝试失败了。因为Scala中的Int表示int原语类型,所以它不能将任何特征混入其中。执行asInstanceOf时,Scala编译器将Int自动装箱到java.lang.Integer中。

代码语言:javascript
复制
scala> val a: Int with Test = 10.asInstanceOf[Int with Test] 
a: Int with Test = 10

scala> a.getClass
res1: Class[_ <: Int] = class java.lang.Integer

但是,在声明类型时不会发生自动装箱,因此必须手动进行:

代码语言:javascript
复制
scala> case class Foo(x: Integer with Test)
defined class Foo

但是,在检查类型之前,编译器类型检查器不会自动装箱:

代码语言:javascript
复制
scala> Foo(a)
<console>:12: error: type mismatch;
 found   : Int with Test
 required: Integer with Test
              Foo(a)
                  ^

因此,必须将变量声明为Integer with Test

代码语言:javascript
复制
scala> val a: Integer with Test = 10.asInstanceOf[Integer with Test]
a: Integer with Test = 10

scala> Foo(a)
res3: Foo = Foo(10)

或者在调用case类时使用强制转换:

代码语言:javascript
复制
val a : Int with Test = 10.asInstanceOf[Int with Test]
scala> a: Int with Test = 10

scala> Foo(a.asInstanceOf[Integer with Test])
res0: Foo = Foo(10)
票数 5
EN

Stack Overflow用户

发布于 2020-04-19 13:22:35

正如@Travis所说,这是一个已知的问题,固定在Scala2.11.7中。

在氨化Repl 2.0.4下运行(Scala2.12.10 java 1.8.0_242)

代码语言:javascript
复制
@case class Foo(a: Int with Test)
a: Int with Test = 10
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20094679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档