1

我无法使用最新的dotty(0.9.0-RC1)编译以下代码,乍一看它看起来应该......

object UnionMapping {

  private def parse(string: String): Int | Double = {
    if(string.contains("."))
      string.toDouble
    else
      string.toInt
  }

  def test_number = {
    val strings: Seq[String] = Seq("123", "2.0", "42")
    // Works
    val asdf: Seq[AnyVal] = strings.map(parse(_))
    // Fails to compile
    val union: Seq[Int | Double] = strings.map(parse(_))
  }

}

有没有人知道它为什么会失败以及它是否可以工作?

4

1 回答 1

2

目前,类型推断几乎从不推断联合类型,因为它通常不是最佳选择。在您的特定示例中,我同意这样做会更有意义,因此我打开了https://github.com/lampepfl/dotty/issues/4867来跟踪它。同时,您可以通过手动指定类型参数来编译它:

val union = strings.map[Int | Double, Seq[Int | Double]](parse(_))

或者通过将联合隐藏在类型别名后面:

object UnionMapping {

  type Or[A, B] = A | B

  private def parse(string: String): Or[Int, Double] = {
    if(string.contains("."))
      string.toDouble
    else
      string.toInt
  }

  def test_number = {
    val strings: Seq[String] = Seq("123", "2.0", "42")
    val union = strings.map(parse(_))
      // infered type for union is Seq[Or[Int, Double]]
  }

}
于 2018-07-30T11:41:35.703 回答