0

在这段代码中,编译器消息说它期望“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

4

2 回答 2

1

问题是这条线

class IntCommandField[Long] (val v: Long) ...

解决方案是删除[Long].

当前声明定义了一个泛型类,其中泛型类型被调用Long。在这个类里面Long是指这个泛型类,与内置类型无关Long

当编译器看到这个

private def add (i:Long, j:Long): Long = i + j

它看到一个+运算符应用了两个泛型类型的值。Scala+在所有需要 a 的类型上定义了一个泛型,String因此它尝试使用它。因为j不是String您收到您看到的错误消息。

于 2019-04-19T05:20:13.230 回答
0

以下不会隐式转换LongString(您需要从中删除Long类型注释IntCommandField):

trait CommandField[A] {
  val v: A
  def |: (that: CommandField[A]):CommandField[A]
}

class IntCommandField(val v: Long) extends CommandField[Long] {
  override def |: (that: CommandField[Long]): CommandField[Long] =
    new IntCommandField(add(that.v, this.v))

  private def add(i:Long, j:Long): Long = i + j
}

您的代码中的另一个问题:

  • 如果在方法声明override之前放置关键字|:,编译器会报错Method |: overrides nothing。上面的代码解决了这个问题。
于 2019-04-19T01:47:35.570 回答