【问题标题】:Java Generic Type Converted to Scala does not accept super class itself转换为 Scala 的 Java 泛型类型不接受超类本身
【发布时间】:2018-10-31 16:29:15
【问题描述】:

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

【问题讨论】:

  • 那是因为? extends File对应Scala中的存在类型_ &lt;: File。那么,如果按照错误消息的提示将def calculate( component: MyComponent[File] ): Unit = ??? 替换为def calculate(component: MyComponentFile[_ &lt;: File]): Unit = ??? 会发生什么?
  • @AndreyTyukin:你是对的。谢啦。很久之后才回到Scala。真的没有想到。

标签: java scala types existential-type bounded-wildcard


【解决方案1】:

Java 的通配符类型

? extends File

对应存在类型

_ <: File

在 Scala 中。尝试更改签名

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

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

还请注意,如果 MyComponent 是您控制的 Scala 类,则将不变类型参数更改为协变类型参数 +F 也可能有效,因为每个 MyComponent[F] forSome { type F &lt;: File } 都是MyComponent[File].

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多