Как внедрить зависимости через Scala Reader из кода Java

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

  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);

person Alexandr    schedule 27.03.2019    source источник


Ответы (1)


Пытаться:

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

Общий совет:

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

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

person Andrey Tyukin    schedule 27.03.2019
comment
Да, это работает. Я немного упростил его до: TupleEx.f (). Apply (s). В "беге" нет необходимости. - person Alexandr; 27.03.2019
comment
@Alexandr А, действительно, Kleisli отменяет apply, просто перенаправляя его на run. - person Andrey Tyukin; 27.03.2019