Прямая ссылка распространяется на определение проблемы стоимости
У меня есть некоторые проблемы в Scala для разрешения неявных значений, и у меня есть загадочное сообщение об ошибке в NetBeans:
msgstr "ошибка: прямая ссылка распространяется на определение значения..."
или в консоли Scala у меня есть другое сообщение об ошибке
msgstr "несоответствие типов: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)
}
У меня есть 2 проблемы, потому что 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
}
1 ответ
Я не уверен, чего вы здесь добиваетесь, но вот несколько советов:
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) ( ...
Я надеюсь, что эта информация полезна.