Как неявный scala делает абстрактный метод допустимым параметром, чтобы я мог использовать метод в Java - PullRequest
0 голосов
/ 19 июня 2019

Так что это немного странный вопрос, но я пытаюсь использовать фрагмент кода, который находится в Scala и принимает набор параметров. В scala параметры являются косвенными, поэтому scala может использовать свою магию, чтобы заполнить то, что нужно этим объектам. Но так как я не могу сделать абстрактный объект «неявным» в Java, мне нужно выяснить, как создать объект, но я не могу этого сделать для меня.

Вот код скалы:

class AsyncSchemaRegistryClient (
  val baseUri: String
) (
  implicit as: ActorSystem,
  m: Materializer,
  ec: ExecutionContext
) extends SchemaRegistryClient[Future] with Json4sSupport {...

Так что это вызывается другим методом в оригинальном коде (по длинному извилистому пути Guice Inject и субмодулей, который достаточно сложен, чтобы следовать как есть), и я пытаюсь вызвать его в java-коде так:

private AsyncSchemaRegistryClient asyncSchemaRegistryClient = new AsyncSchemaRegistryClient("test", ActorSystem.create(), Materializer(), new ExecutionContext);

Теперь ActorSystem.create (), кажется, является действительным (по крайней мере, компилятор не кричит об этом), но Materializer и ExecutionContext, которые я не могу инициализировать, потому что они абстрактны. Также стоит сказать, что Materializer - это akka.stream.Materializer, а ExecutionContext - это scala.concurrent.ExecutionContext.

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

Заранее спасибо за любые советы!

1 Ответ

1 голос
/ 19 июня 2019

Попробуйте

ActorSystem system = ActorSystem.create();
ExecutionContextExecutor ec = system.dispatcher();
ActorMaterializer mat = ActorMaterializer.create(system);

new AsyncSchemaRegistryClient("test", system, mat, ec);
...