1

次の例を考えてみましょう。これは 8 を出力するはずです。なぜ はそれが文字列であるべきだとA.Value + B.Value考えるのでしょうか? B.Valueどうすれば修正できますか?

object Catano extends App {
  val const3 = new Constant(3)
  val const5 = new Constant(5)

  val block = new Arithmetic(const3.Result, const5.Result)

  println(block.Sum.Value)
}

class Block

class Arithmetic[T: Numeric](val A: Connector[T], val B: Connector[T]) extends Block {
  def Sum = new Connector({ A.Value + B.Value })
}

class Constant[T](x: T) extends Block {
  def Result = new Connector({ x })
}

class Connector[T](f: => T) {
  def Value: T = f
}

タイプ セーフの理由から、以下は Type 例外で失敗するはずです。

  val const3 = new Constant("ping")
  val const5 = new Constant("pong")

  val block = new Arithmetic(const3.Result, const5.Result)
4

2 に答える 2

6

問題は次の方法で再現できます。

class C[T: Numeric] {def add(a: T, b: T) = a+b }
error: type mismatch;
found   : T
required: String

そこで何が起こっているか: Java のように scala では、String + 何でも、また何でも + String を実行できます。Java とは異なり、pperator は通常のメソッド呼び出しにすぎないため、各型に対応する + メソッドがあることを意味しているようです。もちろん、Java 型にはそのようなメソッドがないため、そうではありません。私たちが持っているのはimplicit def any2StringAdd(x: Any)にあり、暗黙的な変換によってPredefこれを利用できるようにします。+あなたのコードでは、これが利用可能な唯一の +B.ValueですString

+意図したものが利用できないのはなぜですか?暗黙のスコープに値T:Numericが存在する必要があります。Numeric[T]T がどのような型であるべきか、 で利用できるメソッドについては何も述べていませんT。このNumeric[T]インスタンスにはdef plus(x: T, y: T): Tメソッドがあります。それだけでは+T では利用できません。plus を直接呼び出すこともできますが、これは便利ではありません。幸いなことに、+への委譲はplus暗黙的な変換によって追加できます ( のよう+(String)Predef)。

import Numeric.Implicits._
于 2011-10-10T14:52:25.533 に答える
0

これは機能します:

class Arithmetic[ T <: Int] (val A: Connector[T], val B: Connector[T]) extends Block {
  def Sum = new Connector({ A.Value + B.Value })
}

+数値には機能がありません

于 2011-10-10T15:02:48.447 に答える