定义的空特征测试:
trait Test
复合类型中使用什么:
scala> val a : Int with Test = 10.asInstanceOf[Int with Test]
a: Int with Test = 10
以及带有复合类型参数的案例类(如未装箱标记类型):
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`.
但它非常适合:
scala> case class Foo(a: List[Int] with Test)
defined class Foo
方法定义没有问题:
scala> def foo(a: Int with Test) = ???
foo: (a: Int with Test)Nothing
斯卡拉版本2.10.3
这是正常的编译器行为吗?
您遇到过 Scala 统一基元和对象的尝试失败的情况之一。自从Int
在Scala中表示Java原始类型int
,它不能混有任何特征。当执行 asInstanceOf 时,Scala 编译器会自动装箱Int
into a java.lang.Integer
:
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
但是,声明类型时不会发生自动装箱,因此您必须手动完成:
scala> case class Foo(x: Integer with Test)
defined class Foo
但是编译器类型检查器在检查类型之前不会自动装箱:
scala> Foo(a)
<console>:12: error: type mismatch;
found : Int with Test
required: Integer with Test
Foo(a)
^
所以你必须将你的变量声明为Integer with Test
:
scala> val a: Integer with Test = 10.asInstanceOf[Integer with Test]
a: Integer with Test = 10
scala> Foo(a)
res3: Foo = Foo(10)
或者在调用案例类时使用强制转换:
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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)