Как экспортировать преобразование Scala в Java

Я пытаюсь реализовать черту Scala с помощью Java, черта имеет общий тип контейнера в другом контейнере, который не может быть решен автоматически с помощью импорта java, код Scala ниже:

import cats.data.{EitherNel, Kleisli, NonEmptyList}
import cats.implicits._

package Export_To_Java {
    package object types {
        type Valid[A] = EitherNel[String, A]
        type ValidOperation[A, B] = Kleisli[Valid, A, B]
        type Amount = BigDecimal
    }

    trait InterestService[Account] {
        import types._

        type InterestOperation = ValidOperation[Account, Option[Amount]]
        type TaxOperation = ValidOperation[Option[Amount], Amount]

        def computeInterest: InterestOperation
        def computeTax: TaxOperation
    }
}

Как только это было реализовано Java, Intellij автоматически генерирует методы:

import cats.data.Kleisli;
import cats.data.NonEmptyList;
import Export_To_Java.InterestService;
import scala.math.BigDecimal;
import scala.util.Either;


public class JavaInterestService<Account> implements InterestService<Account> {
    @Override
    public Kleisli<Either<NonEmptyList<String>, A>, Account, Option<BigDecimal>> computeInterest() {
        throw new NotImplementedException();
    }

    @Override
    public Kleisli<Either<NonEmptyList<String>, A>, Option<BigDecimal>, BigDecimal> computeTax() {
        throw new NotImplementedException();
    }
}

Теперь вы увидите, что тип возвращаемого значения метода java был расширен до Either<NonEmptyList<String>, A>, который по-прежнему имеет общий параметр A внутри, который переносится из типа Scala Valid[A]. Сообщение об ошибке:

Error:(13, 82) java: computeInterest() in JavaInterestService cannot implement computeInterest() in Export_To_Java.InterestService
  return type cats.data.Kleisli<scala.util.Either<cats.data.NonEmptyList<java.lang.String>,A>,Account,scala.Option<scala.math.BigDecimal>> is not compatible with cats.data.Kleisli<scala.util.Either,Account,scala.Option<scala.math.BigDecimal>>

При удалении типа из любой из них будет получена ошибка:

[error] JavaInterestService.java:13:82: scala.util.Either takes two type parameters, expected: one
[error]     public Kleisli<Either, Option<BigDecimal>, BigDecimal> computeInterest() {
[error]                    ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed

конфигурация сбт:

val scalaTestVersion = "3.0.5"
val catsVersion = "1.6.0"

lazy val ShapelessGuide = (project in file(".")).
        settings(
            name := "test",
            version := "0.1",
            scalaVersion := "2.12.8",
            libraryDependencies ++= Seq(
                "org.scalatest" %% "scalatest" % scalaTestVersion % Test,
                "org.typelevel" %% "cats-core" % catsVersion
            ),
            scalacOptions ++= Seq(
                "-language:higherKinds",
                "-deprecation",
                "-encoding", "UTF-8",
                "-Ypartial-unification",
                "-feature",
                "-language:_"
            )
        )

Мне интересно, можно ли реализовать черту Scala в Java? или как правильно это сделать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться

public class JavaInterestService<Account> implements InterestService<Account> {
    @Override
    public Kleisli<Either, Account, Option<BigDecimal>> computeInterest() {
        throw new NotImplementedException();
    }

    @Override
    public Kleisli<Either, Option<BigDecimal>, BigDecimal> computeTax() {
        throw new NotImplementedException();
    }
}

Компилятор Java может видеть типы Scala более высокого типа как необработанные типы как сопоставить смешанный тип функции scala более высокого порядка с общим типом java?

Да, на самом деле я пытался удалить параметры типа из Both, но компилятор выдал другую ошибку: scala.util.Either takes two type parameters, expected: one.

user3593261 05.04.2019 15:16

И Intellij также предупреждал, что метод был attempting to use incompatible return type.

user3593261 05.04.2019 15:18

@user3593261 user3593261 Код компилируется без ошибок gist.github.com/ДмытроМитин/3dab1f318757e1b30d3bf8b3de097ee3 Предупреждения IntelliJ не имеют значения.

Dmytro Mitin 05.04.2019 15:37

Странно, мой компилятор не проходит, у меня версия java 1.8.0_152, а у вас какая?

user3593261 05.04.2019 15:48

1.8.0_162. Делай sbt compile. Что в итоге?

Dmytro Mitin 05.04.2019 15:57

Да, это sbt compile. Я обновил пост, добавив ошибку.

user3593261 05.04.2019 16:01

Какой у тебя build.sbt?

Dmytro Mitin 05.04.2019 16:03

Попробуйте сделать sbt clean compile. Попробуйте импортировать мой проект github.com/ДмытроМитин/тест и запустить sbt compile.

Dmytro Mitin 05.04.2019 16:20

Отлично!, прошло с clean! Спасибо! ты спаси мой день!!

user3593261 05.04.2019 16:35

Другие вопросы по теме