パラメトリックタイプ +関数2番目のパラメーターとして文字列が必要ですか?

StackOverflow https://stackoverflow.com/questions/3127934

質問

class TestClass[T](val x: T) { def +(other: TestClass[T]) = x + other.x }

この定義により、次のコンパイルエラーが得られます。

エラー:タイプミスマッチ。
見つかった:t
必須:文字列
def +(その他:testclass [t])= x + other.x

intまたはdoubleをタイプパラメーターとして使用して、Scalaで追加することはできませんか?

役に立ちましたか?

解決

まず、エラーメッセージは誤解を招くものです。 Scalacはメソッドを見つけようとします + 価値について x. 。これはタイプには存在しません T, 、これはあらゆるタイプである可能性があります。これは、バウンドされていないタイプパラメーターと呼ばれます。したがって、それは適用され、暗黙の見解を試みます。 Predef.any2stringadd 法案に適合します。

この暗黙の変換を無効にして、実際のエラーを確認できます。

 ~/code/scratch: cat plus.scala 
import Predef.{any2stringadd => _, _}

class TestClass[T](val x: T) { 
  def +(other: TestClass[T]) = x + other.x 
}
 ~/code/scratch: scalac plus.scala 
plus.scala:4: error: value + is not a member of type parameter T
  def +(other: TestClass[T]) = x + other.x 
                               ^
one error found

C ++では、各コールサイトでタイプパラメーターが提供された後にタイプチェックが行われます。したがって、このスタイルのコードは機能します。 SCALAでは、一般的な方法は、抽象型の境界のみに基づいて、その定義でタイプチェックする必要があります。

VONCが示唆しているように、Typeパラメーターにバインドされたコンテキストを提供することをお勧めします T 対応するインスタンスがあるタイプに制約する Numeric 特性。

class TestClass[T: Numeric](val x: T) { 
  def +(other: TestClass[T]): T = {
    val num = implicitly[Numeric[T]]
    import num._
    x + other.x
  }
}

これは、明示的にされたすべてのインクリットでこれがどのように見えるかです:

class TestClass[T]{
  implicit <paramaccessor> private[this] val evidence$1: Numeric[T] = _;
  def this(x: T)(implicit evidence$1: Numeric[T]): TestClass[T] = {
    TestClass.super.this();
    ()
  };
  def +(other: TestClass[T]): T = {
    val num: Numeric[T] = scala.Predef.implicitly[Numeric[T]](TestClass.this.evidence$1);
    import num._;
    num.mkNumericOps(TestClass.this.x).+(other.x)
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top