【问题标题】:Using Scala type aliases from Java code在 Java 代码中使用 Scala 类型别名
【发布时间】:2012-11-20 08:43:07
【问题描述】:

假设我在 scala 中将类型别名定义为

object Foo {
  type Bar = Option[String]
}

看起来我不能像这样在 Java 代码中引用别名(它只是抱怨 找不到符号):

import Foo.*;

public class Cafebabe {
  void bar(Bar x) {
  //...
  }
}

我也尝试过静态导入。

(更具体地说,我有 java 反射代码,我无法更改它需要知道参数类型并且我需要向它提供 Bar 别名)。

我知道,我可以在 Scala 中创建包装器

class BarWrapper(value: Bar)

但也许我错过了其他方式?

【问题讨论】:

    标签: java scala scala-java-interop type-alias


    【解决方案1】:

    类型别名仅对 Scala 编译器可见,并且与泛型类型一样,它们不会出现在 JVM 类文件中的任何位置。

    如果您使用的是 Java,那么您将无法使用无别名类型 Option[String],因为 javac 无法知道您在 Scala 代码中声明的类型别名 Bar。无论您在哪里使用Bar,只需使用Option[String](Java 中的scala.Option<String>),它应该可以正常工作。

    【讨论】:

    • 类型别名 have 出现在 JVM 类文件的某处,否则您将无法使用其他库中的别名。但据我发现,它们在类定义中的一些“附加数据”字段中被打乱了。
    • @Keros - 这是一个很好的观点,但是通过相同的逻辑,泛型类型签名信息也以某种格式包含在类文件中。无论他们在编译类型声明时使用什么格式,遗憾的是 Java 都无法识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2013-03-18
    相关资源
    最近更新 更多