转换为 Scala 的 Java 泛型类型不接受超类本身



我正在编写一个框架。接口是用 Java 代码编写和编译的。客户端使用 Scala 和这些接口。下面是接口的示例。

public interface Context {
MyComponent<? extends File> getComponent();
}

现在我的 scala 代码使用接口如下。

val component = context.getComponent();
println(calculate(component));
def calculate( component: MyComponent[File] ): Unit = ???

Scala 编译器在第 2 行抛出错误以进行println(calculate(component))。错误是:类型不匹配,预期:MyComponent[File],实际:MyComponent[_<:File]。

Java的通配符类型

? extends File

对应于存在类型

_ <: File

在斯卡拉。尝试更改签名

def calculate(component: MyComponent[File]): Unit = ???

def calculate(component: MyComponent[_ <: File]): Unit = ???

另请注意,如果MyComponent是您控制的 Scala 类,那么将不变类型参数更改为协变类型参数+F也可能有效,因为这样每个MyComponent[F] forSome { type F <: File }都是MyComponent[File]的特例。

最新更新