【问题标题】:Call Scala Aux trait with type alias in Java在 Java 中使用类型别名调用 Scala Aux trait
【发布时间】:2018-02-16 09:48:28
【问题描述】:

我在 Scala 中定义了这个 Holder 对象,如下所示:

trait Holder {
  type L
} 

object Holder {
  type Aux[L0] = Holder {type L = L0}
  } 

Scala 中的类型是Holder.Aux[L]。我想在 Java 中引用这种类型,例如在方法调用中,但不确定语法是什么。

【问题讨论】:

  • @LászlóvandenHoek 不一样,见Aux 模式。
  • 还是一样的答案; “类型别名仅对 Scala 编译器可见。” Java没有对应Scala的概念types。
  • 我正在寻求一种潜在的解决方案,将类型 L0 传递给 Holder,无论是否使用可从 Java 调用的类型别名。

标签: java scala


【解决方案1】:

正如在其他地方解释的那样,Java 没有 Scala 的types。

如果您需要 Java 互操作(关于 Holder 中使用的具体类型),坚持类型参数可能对您有用:

trait Holder[LType] {
  type L = LType
}

object Holder extends Holder[L0]

稍微扩展一下,如果 L0 是String,你可以这样做:

trait IHolder[LType] {
  type L = LType
  def l: LType
}

object Holder extends IHolder[String] {
  override val l: L = "foo" //this typechecks
}

然后,从 Java 中,您可以:

IHolder<String> holder = Holder$.MODULE$;
String foo = holder.l();

//or, skipping IHolder:
String foo = Holder.l();

请注意,我重命名了 trait,以便从 Java 代码中调用 Holder.l() 明确地引用 object

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多