在这段代码中,编译器消息说它期望“j”是 String,但它是 Long 基于方法中参数的类型。
我添加了方法 add 来表达类型,因此不需要推理。如果我删除 + "j" 并输入一个常数,问题仍然存在。如果我不使用“+ j”,它就会编译。它的行为就像“that.v”隐式转换为字符串。但是“v”显然是参数列表中的 Long。
我还将说明为什么是“+”。我实际上想要“|” 但编译器说 Long 不支持“|”。因此,有关如何按位或 Long 或 Int 的提示会有所帮助。我的猜测是这些是签名的,也许有一些特定于未签名工作的类应该使用。
我已经将特征放在一个具有相同结果的对象中,这是我所期望的。我尝试过各种导入,比如Long,结果是一样的。
我想知道环境是否存在一些根本问题,例如隐藏的导入。在 Odersky 中处理代码时,我正在使用最新的 IntelliJ。我在另一个文件中有 Rational 类,它编译得很好。
对于一些对新 Scala 程序员来说并不明显的基本问题,我已经走到了尽头。
package com.proclivis.field
trait CommandField[A] {
def |: (that: CommandField[A]):CommandField[A]
}
class IntCommandField[Long] (val v: Long) extends CommandField[Long] {
def |: (that: IntCommandField[Long]): IntCommandField[Long] =
new IntCommandField(add(that.v, this.v))
private def add (i:Long, j:Long): Long = i + j
}
错误:(21, 48) 类型不匹配;发现:需要长:字符串私有定义添加(i:Long,j:Long):Long = i + j