我正在编写一个框架。接口是用 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]
的特例。