Я пытаюсь реализовать черту 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? или как правильно это сделать?




Пытаться
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?
И Intellij также предупреждал, что метод был attempting to use incompatible return type.
@user3593261 user3593261 Код компилируется без ошибок gist.github.com/ДмытроМитин/3dab1f318757e1b30d3bf8b3de097ee3 Предупреждения IntelliJ не имеют значения.
Странно, мой компилятор не проходит, у меня версия java 1.8.0_152, а у вас какая?
1.8.0_162. Делай sbt compile. Что в итоге?
Да, это sbt compile. Я обновил пост, добавив ошибку.
Какой у тебя build.sbt?
Попробуйте сделать sbt clean compile. Попробуйте импортировать мой проект github.com/ДмытроМитин/тест и запустить sbt compile.
Отлично!, прошло с clean! Спасибо! ты спаси мой день!!
Да, на самом деле я пытался удалить параметры типа из Both, но компилятор выдал другую ошибку:
scala.util.Either takes two type parameters, expected: one.