Как получить доступ к неявному преобразованию определенного класса (в Scala)? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть абстрактный класс, например, так:

abstract class Base {
  val myInners = mutable.ArrayBuffer[Inner[Any]]()
  abstract class Inner[+T] {
    myInners += this
    def get: T
    // other functionality here
  }
  implicit def innerToValue[T](inner: Inner[T]) = inner.get
  class IntInner extends Inner[Int] { ... }
  class StringInner extends Inner[String] { ... }
  ...
}

Изначально у меня был одноэлементный объект, такой как

object MyObject extends Base {
  val intVal = new IntInner()
  val stringVal = new StringInner()
  ...
}

И я мог использовать эти члены объекта в другом месте, например, functionThatExpectsAnInteger(MyObject.intVal)что сделало меня счастливым:).

Однако, чтобы улучшить тестируемость, я бы хотел превратить это object в class и внедрить экземпляр этого класса, где бы он ни использовался.Однако, превращая MyObject в класс, я, похоже, больше не могу использовать это неявное преобразование независимо от того, что я пытался, что меня огорчает: (.

Конечно, это преобразование только спасает менявызов метода get, и я могу жить без него, но я все еще узнаю о последствиях для scala, и я хотел бы понять, почему это не работает и если - это способ сделатьэто.

1 Ответ

0 голосов
/ 23 июня 2018

Что-то странное в твоих последствиях, но я предполагаю, что это всего лишь пример, поэтому я не буду вдаваться в подробности.

Причина, по которой я вижу, почему это не работает, заключается в том, что компилятор ищет следствия в области объекта-компаньона. Если вы превратите его в класс, вам придется сначала его импортировать. Один из способов сделать это будет следующим:

val obj = new MyObject()
import obj.innerToValue
val x : Int = obj.intVal

Я уверен, что это можно сделать лучше, но только изменив общую структуру кода.

...