2017-04-19 3 views
0

:どのように数値であることを、出力パラメータを必要とするようにScalaのトレイト:私はこのような特性にいくつかの番号を返す必要があり、一般的な関数を指定しようとしているあいまいな暗黙の値がエラー

import Numeric.Implicits._ 

trait ReturnsNumberResult { 
    def process[T : Numeric](): T 
    def output[T : Numeric](v: T)(implicit numeric: Numeric[T]): String 
    def runJob(): Any = { 
     output(process()) 
} 

私がしようとしているときこの特性をコンパイルしますエラーが発生しました:

ambiguous implicit values: [error] both object BigIntIsIntegral in object Numeric of type scala.math.Numeric.BigIntIsIntegral.type [error] and object IntIsIntegral in object Numeric of type scala.math.Numeric.IntIsIntegral.type [error] match expected type Numeric[T] [error] output(process())

何が問題なのですか?

+1

私はこの 'デフ出力[T:数値]信じる(V:T)を(暗黙の数値:数値[T])は'冗長です。 '[T:Numeric]'は、暗黙的なパラメータ宣言の文法的な砂糖です。 – jwvh

+0

ありがとうございます。あなたは正しいです – user2975535

答えて

1

これはrunJobにによって引き起こされるが、明示的にあなたのoutputprocess方法のためT: Numeric種類を宣言しません。

ので、コンパイラはrunJob方法の両方outputprocessメソッドの種類T: Numericを推測することはできません。

だからあなたが好きそれを修正することができます:

def runJob[T: Numeric](): Any = { //explicitly declare the type T: Numeric 
    output[T](process()) // In there we explicitly set the type `T` for output, and for `process` method can auto infer from `output` method 
    } 
+0

申し訳ありません@chengpohi私は、私のコードから間違いを単純化するために重要な部分を削除しました。私は今それを追加しました。あなたはそれを見ることができますか? – user2975535

+0

@ user2975535、答えを更新しました。それがあなたのために役立つことを願っています。 – chengpohi

+0

ありがとうございます。あなたが正しいです。しかし、私はAPIに従わなければならないので、私はrunJobの署名を変更することはできません。私の特性はAPI特性を拡張する – user2975535

関連する問題