Как внедрить зависимости через Scala Reader из кода Java - PullRequest
3 голосов
/ 27 марта 2019

Вот служба зависимостей:

  public class Service1 {}

Scala-код, который использует его через считыватель:

object TupleEx {
  type FailFast[A] = Either[List[String], A]
  type Env[A] = ReaderT[FailFast, Service1, A]

  import cats.syntax.applicative._
  import cats.instances.either._

  def f:Env[Int] = 10.pure[Env]
}

Java-тест, в котором я пытаюсь внедрить Service1:

  @Test
  public void testf() {
    Service1 s = new Service1();
    TupleEx.f().run(s);
  }

Я получаю исключение:

Ошибка: (10, 16) java: метод, запущенный в классе cats.data. Kleisli нельзя применить к данным типам;обязательно: аргументы не найдены: com.savdev.Service1 причина: фактические и формальные списки аргументов различаются по длине

Хотя в Scala я мог бы запустить его как:

TupleEx.f().run(s);

1 Ответ

4 голосов
/ 27 марта 2019

Попробуйте:

TupleEx.f().run().apply(s);
  • run() - это метод "получения" val внутри Kleisli
  • apply(), который обычно скрываетсяСинтаксический сахар Scala

Общие рекомендации:

  1. Запишите интерфейс в Java
  2. Реализуйте интерфейс в Scala
  3. Используйте все, что угодноПри написании кода на Java написано только через интерфейсы Java.
  4. Не пытайтесь использовать интерфейсы Scala напрямую при написании кода на Java.

Помните: компилятор Scala понимает Java.Ява ничего не знает о Scala.Реализация Java-интерфейсов в Scala тривиальна.Использование интерфейсов Scala из Java неудобно.

...