3

私は暗黙の値を解決するためにscalaでいくつかの問題を抱えています、そして私はnetbeansで不可解なエラーメッセージを持っています:

「エラー:前方参照が値の定義を超えています...」

またはscalaコンソールで他のエラーメッセージが表示されます

"タイプmistmatch:29:エラー:タイプの不一致;見つかった:Factory.type(基になるタイプオブジェクトFactoryを含む)が必要:GenericFactory"

私のクラスと主な機能のいくつかの説明:

import java.util.Random

//////////
// Main //

//Implicit random for all classes and object
implicit val aprng = new Random

//Implicit object Factory used in other class
implicit val factory = Factory

abstract class GenericFactory {
def build 
}

object Factory extends GenericFactory{
def build = println("return factory")
}

class A (rate: Random => Double = aprng => aprng.nextFloat, val factory : GenericFactory) {

  def this(rate : Double, factory : GenericFactory) = this( _ => rate, factory)

  def operate(genomes: IndexedSeq[Int])(implicit aprng: Random) = { 
println("calculate genomes with aprng random values")}
}

object B{
val instanceOfA = new A(rate => 0.5d,factory)
}

1)クラスAの引数でオブジェクトを渡すことができるので、この抽象クラスを渡すために抽象クラスを定義しますが、ここでは機能しません:/ 2)その後、クラスAに定義された暗黙の値は認識されず、エラーメッセージで失敗します。

この問題を解決するためのアイデアや答えはありますか?

編集1

私はagisteelの助けを借りてコードを更新します、それは大丈夫です、コードは実行されています:)

import java.util.Random

//////////
// Main //

//Implicit random for all classes and object
implicit val aprng = new Random
implicit val function: Random => Double = arpng => arpng.nextFloat

abstract class GenericFactory 
{
  def build = println("build")
}

implicit object Factory extends GenericFactory
{
  def build = println("return factory")
}

class A (implicit rate: Random => Double, implicit val factory : GenericFactory) {

  //def this(rate : Double, factory : GenericFactory) = this( _ => rate, factory)

  def operate(genomes: IndexedSeq[Int])(implicit aprng: Random) = { 
    println("calculate genomes with aprng random values")}
}

object B{
val instanceOfA = new A
}
4

1 に答える 1

3

ここで何を達成しようとしているのかわかりませんが、いくつかのヒントがあります。

1)代わりに:

implicit val factory = Factory
object Factory extends GenericFactory { ...

これを試して:

implicit object Factory extends GenericFactory { ...

2)ラムダのデフォルト値は、私が知る限り、暗黙的にのみ提供できるため、次の代わりに:

class A (rate: Random => Double = aprng => aprng.nextFloat, ...

これを試して:

implicit val function: Random => Double = arpng => arpng.nextFloat
class A (implicit rate: Random => Double) ( ...

この情報がお役に立てば幸いです。

于 2011-07-29T09:34:24.800 に答える