Как выразить границы типов на стертом универсальном интерфейсе в Scala? - PullRequest
0 голосов
/ 15 апреля 2019

Вот интерфейс, определенный в Java:

public interface TBase<T extends TBase, F extends TFieldIdEnum>

Когда я пытался добавить границы типов для методов, использующих этот интерфейс, как показано ниже:

def test[TB[A <: TBase[_, _], B <: TFieldIdEnum] <: TBase[A, B]](x: TB[_, _]) = x

Произошла ошибка:

type T's bounds <: TBase are stricter than type A's declared bounds <: TBase[_, _]

Так, как я могу выразить границы типа

T <: TBase

в Скале?


Дополнительная информация:

Я использую Scala 2.11.8, а интерфейс взят из очень старой версии apache thrift, thrift-0.5.0

И после долгих попыток до сих пор единственным успешным является удаление параметра типа с более высоким родом:

def test[A <: TBase[_, _], B <: TFieldIdEnum](x: TBase[A, B]) = x

1 Ответ

1 голос
/ 15 апреля 2019

С

scalaVersion := "2.12.8"
libraryDependencies += "org.apache.thrift" % "libthrift" % "0.12.0"

код

import org.apache.thrift.{TBase, TFieldIdEnum}
import scala.language.higherKinds

object App {
  def test[TB[A <: TBase[_, _], B <: TFieldIdEnum] <: TBase[A, B]](x: TB[_, _]) = x
}

выдает ошибку

Error:(5, 55) type arguments [A,B] do not conform to trait TBase's type parameter bounds [T <: org.apache.thrift.TBase[T,F],F <: org.apache.thrift.TFieldIdEnum]
  def test[TB[A <: TBase[_, _], B <: TFieldIdEnum] <: TBase[A, B]](x: TB[_, _]) = x

Это не совсем твое, но похоже.

Самое простое исправление -

  def test[TB[A <: TBase[A, B], B <: TFieldIdEnum] <: TBase[A, B]](x: TB[_, _]) = x

С

scalaVersion := "2.11.8"
resolvers += "twitter-repo" at "http://maven.twttr.com"
libraryDependencies += "org.apache.thrift" % "libthrift" % "0.5.0"

Я не могу воспроизвести вашу ошибку.

import org.apache.thrift.{TBase, TFieldIdEnum}
import scala.language.higherKinds

object App {
  def test[TB[A <: TBase[_, _], B <: TFieldIdEnum] <: TBase[A, B]](x: TB[_, _]) = x
}

компилируется без ошибок.

...