IntelliJ показывает ошибки несоответствия типов в зависимых типах методов, даже если sbt компилируется нормально (scala) - PullRequest
2 голосов
/ 07 марта 2020

У меня есть такая черта, как:

trait NumberRepository[C <: AppContext] {
  def findAll(implicit ctx: C): ctx.Result[Seq[Int]]
  def findEvens(implicit ctx: C): ctx.Result[Seq[Int]] = findAll.map(_.filter(_ % 2 == 0))
}

Она может быть скомпилирована без ошибок при использовании SBT. Но мой IntelliJ сообщает об ошибке несоответствия типов возвращаемому значению findEvens в его редакторе.

Type mismatch.
Required: ctx.Result[scala.Seq[Int]]
Found: C#Result[scala.collection.Seq[Int]]

Я обнаружил, что могу обойти эту проблему, передав параметр 'ctx' в функцию findAll в явном виде. Но я не хочу этого делать по некоторым причинам.

// it's OK!
def findEvens(implicit ctx: C): ctx.Result[Seq[Int]] = findAll(ctx).map(_.filter(_ % 2 == 0))

Это ошибка? Или что-то не так с моим кодом или конфигурациями? Есть ли способ исправить эту ошибку?

AppContext выглядит следующим образом:

trait AppContext {
  type Result[+A] <: AppResult[Result, A]
  def success[A](a: A): Result[A]
}

trait AppResult[F[+_], +A] {
  def map[B](f: A => B): F[B]
  def flatMap[B](f: A => F[B]): F[B]
}

class AppContextImpl extends AppContext {
  type Result[+A] = AppResultImpl[A]
  override def success[A](a: A): AppResultImpl[A] = AppResultImpl(Some(a))
}

case class AppResultImpl[+A](value: Option[A]) extends AppResult[AppResultImpl, A] {
  override def map[B](f: A => B): AppResultImpl[B] = AppResultImpl(value.map(f))
  override def flatMap[B](f: A => AppResultImpl[B]): AppResultImpl[B] = value match {
    case Some(a) => f(a)
    case None => AppResultImpl(None)
  }
}

class NumberRepositoryImpl extends NumberRepository[AppContextImpl] {
  override def findAll(implicit ctx: AppContextImpl): AppResultImpl[Seq[Int]] = ctx.success(1 to 10)
}

1 Ответ

1 голос
/ 07 марта 2020

Scala подсветка с учетом типов - это функция IntelliJ, отдельная от самого компилятора scala, поэтому иногда она может вести себя по-другому. Легко сообщать о ложных ошибках

Чтобы помочь нам исправить ошибку выделения, вы можете сообщить о ней в YouTrack как обычно или нажав Alt + Enter при неправильном выделении:

enter image description here

Подсветку с учетом типа также можно отключить / включить с помощью небольшого значка T в правом нижнем углу

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...