如何在Scala中的类型已擦除通用接口上表达类型界限?

时间:2019-04-15 06:14:39

标签: scala generics type-bounds

这是用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中?


其他信息:

我正在使用Scala 2.11.8,该接口来自apthr thrift的一个非常旧的版本thrift-0.5.0

经过多次尝试, 到目前为止,唯一成功的方法是删除更高种类的类型参数:

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

1 个答案:

答案 0 :(得分:1)

使用

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
}

编译没有错误。