Longを必要とする次の関数を定義し、次の暗黙関数を定義すると、最初の関数にDateを渡すと暗黙関数が使用され、Scalaの暗黙関数が期待どおりに動作しない
def millisToDays(in: Long): Int = (in/(1000L * 3600L * 24L)).toInt
implicit def dateToLong(d: Date) = d.getTime
println(millisToDays(new Date))
しかし、次の第二の例のために、私は3行目のコンパイルエラーを取得:[:java.lang.Number型T <]「推論された型引数[INTは]方法mySumの型パラメータの境界に準拠していません。
def mySum[T <: Number](as: T*): Double = as.foldLeft(0d)(_ + _.doubleValue)
implicit def intToInteger(n: Int): Integer = new Integer(n.toInt)
var r = mySum(2, 3)
何h私は間違っていた? intToInteger暗黙関数が使用されていないのはなぜですか?
暗黙の関数が "T <:Number"を返すのではなく、むしろIntegerを返すということは、暗黙の関数が実際に有用であるとコンパイラが推測できないことを推測しています。
暗黙の関数を使用する必要があるというヒントをコンパイラに与えることはできますか?
ありがとうございます!
アリ
あなたがこれを行う場合は、カスタムの暗黙の 'へ
T
から利用できる暗黙的な変換があることを、正確に何をしたい指定する、ありintToInteger' Scalaがあなたのためにそれをするので、削除することができます。 – hellectronicほとんど、葉巻はありません:この関数定義を使用して暗黙的に使用すると、別のエラーが発生します: "def mySum [T <%Number](as:T *):Double = as.foldLeft(0d)(_ + _.doubleValue)」を参照してください。新しいエラーは次のとおりです。暗黙の暗黙値:両方のメソッドint2Integerオブジェクト内の型(x:Int)のPredef java.lang.Integerおよびint2bigInt型(i:Int)のBigInt型のメソッドscala.math.BigInt match期待される型Int = > java.lang.Number –
'scala.math.BigInt._'をインポートしていますか?私はそのインポートを行った後にあなたのエラーを再現することができました。 BigIntには 'Int => Number'に準拠した暗黙の変換が含まれているため、エラーが発生しています。コンパイラはどちらを使用するのかわかりません。 –