Java 类的 Scala 泛型类型推断

Max*_*xim 5 java generics scala

假设我们在某个外部库中定义了以下 Java 接口(因此我们无法控制它):

public interface JavaTest<R extends Something> { }

public class JavaTestImpl implements JavaTest<SomethingSpecific> {
  public static final JavaTestImpl INSTANCE = ...
}
Run Code Online (Sandbox Code Playgroud)

现在我们想要编写 Scala 函数,它将采用任意实例JavaTest作为参数,并提取实例本身的类型和R泛型参数(例如,我们想要对实例类进行隐式类型类查找):

def test[A <: Something, X <: JavaTest[A]](x: X)(implicit tc: TypeClass[X]): A = {}

test(JavaTestImpl.INSTANCE) // should be [SomethingSpecific, JavaTestImpl]
Run Code Online (Sandbox Code Playgroud)

不幸的是,它的工作方式并不简单:编译器将调用test推断为 as [Nothing, JavaTestImpl],然后立即失败,因为推断的类型是错误的并且不满足约束。

有没有办法让 Scala 编译器推断相应的类型参数,而无需更改 Java 部分,也无需每次都编写大量样板文件?SomethingSpecific或者,换个方式提出问题,如果我们知道实例 ( ) 的类型,是否有办法提取泛型类型( JavaTestImpl) ?