Scala类型的再次解析

12 浏览
0 Comments

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)  // 无法编译

0
0 Comments

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)  // 编译通过

0