【发布时间】:2019-04-19 00:17:42
【问题描述】:
在这段代码中,编译器消息说它期望“j”是字符串,但根据方法中参数的类型,它是 Long。
我添加了方法 add 来表达类型,因此不需要推理。如果我删除 + "j" 并输入一个常数,问题仍然存在。如果我不使用“+ j”,它就会编译。它的行为就像“that.v”隐式转换为字符串。但是“v”显然是参数列表中的Long。
我还会说明为什么是“+”。我实际上想要“|”但编译器说 Long 不支持“|”。因此,有关如何按位或 Long 或 Int 的提示会有所帮助。我的猜测是这些是签名的,也许有一些特定于未签名工作的类应该使用。
我已经将 trait 放在一个对象中,结果相同,这是我所期望的。我试过各种导入,比如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) 类型不匹配; 发现:长 必需:字符串 private def add (i:Long, j:Long): Long = i + j
【问题讨论】:
标签: scala