Scala类型的再次解析
Scala类型的再次解析
我原以为我对Scala中type关键字的正确使用有很好的理解,是通过阅读以下文章:\nUnderstanding what \'type\' keyword does in Scala
\nScala: Abstract types vs generics\n然而,我不清楚为什么以下代码无法编译。根据AddableNum的定义,我应该能够为任何定义了两个整数之间的加法的类型定义add()方法,是吗?哦,但不!我错过了什么? \n
type Nums <:Int type AddableNum <: { def +(x:Nums): Nums} class MyNum (value:AddableNum) { def add (that:Nums) : Nums = value + that } val i:Int = 5 val test = new MyNum(i) // 无法编译
Scala types redux问题的出现是因为在代码中存在一些问题。首先,代码中使用了错误的语法来定义Nums的类型别名,应该使用等号而不是冒号。另外,在定义AddableNum的时候,应该使用AnyVal来接受Int类型(默认是AnyRef类型)。
为了解决这些问题,可以使用以下代码:
type Nums = Int // 应该使用等号,因为AddableNum不能引用抽象类型 // AddableNum是结构类型定义的类型别名 // 应该使用AnyVal来接受Int类型(默认是AnyRef类型) type AddableNum = AnyVal { def +(x:Nums): Nums} class MyNum[T <: AddableNum](value: T) { // 在这里使用类型约束(而不是上一行) def add (that:Nums) : Nums = value + that } val i:Int = 5 val test = new MyNum(i) // 编译通过