scala - case语句中的类型推断失败

标签 scala types compiler-errors

据我所知,这是最小的案例。

import akka.actor.ActorDSL.Act
trait Foo[A]

object Foo {
  case class Str(str: String) extends Foo[String]
  case object Actor extends Foo[Act]

  def foo[A](f: Foo[A]): A = f match {
    case Str(string) => string
    case Actor => new Act {
      become { case e => println(e) }
    }
  }
}

通过此错误
Foo.scala:12: type mismatch;
[error]  found   : akka.actor.ActorDSL.Act
[error]  required: A
[error]     case Actor => new Act {
[error]                   ^
Str大小写只是用来说明类型推断在正常用例中有效,但是Scala某种程度上“忘记”了A在检查case语句的返回类型时应该是特定类型。

请注意,如果将new Act中的部分函数提取为单独的函数,它将再次正确编译。
import akka.actor.ActorDSL.Act
trait Foo[A]

object Foo {
  case class Str(str: String) extends Foo[String]
  case object Actor extends Foo[Act]

  val partial: PartialFunction[Any, Unit] = {
    case e => println(e)
  }

  def foo[A](f: Foo[A]): A = f match {
    case Str(string) => string
    case Actor => new Act {
      become(partial)
    }
  }
}

这是编译器错误吗?

最佳答案

您的导入必须有问题,因为否则示例将正确编译:

trait Foo[A]
trait Act

object Foo {
  case class Str(str: String) extends Foo[String]
  case object Actor extends Foo[Act]

  def foo[A](f: Foo[A]): A = f match {
    case Str(string) => string
    case Actor => new Act {}
  }
}

在Scala 2.11.7中测试。

关于scala - case语句中的类型推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35649550/

相关文章:

sql - 不带 '?'的JDBC RDD查询语句

Scala - 为什么无法覆盖父类(super class)的方法

编译器错误: undefined reference to `print'

java - 我认为我在编译Java文件时遇到问题

scala - Quill onconflict更新多个值

java - 如何查看我的 Scala 应用程序加载的 JAR 列表

C++11 - 返回表达式以确定类型

java - 如何处理最终字符串?

c++ - 无法理解arduino示例代码的语法

c - LNK2005 在 .c 文件中包含 .h 文件时发生