为什么在用于案例类的理解和模式匹配中编译错误

时间:2012-10-06 16:34:26

标签: scala

有谁知道为什么以下代码无法通过编译?我只是不知道为什么会发生类型不匹配。

输出应如下所示:

List(Book, DVD, MP3)

我的代码:

package library3 {

  abstract class Item() {
    def use(): Unit
  }

  // match on Items.

  case class Book (val title: String) extends Item
  case class DVD (val title: String) extends Item
  case class MP3 (val title: String) extends Item
}

object Ch3_2 {

  import library3._

  def main( args:Array[String] ) = {
    val items = List( new Book( "The Hobbit" ),
              new DVD( "Black Adder Goes Forth" ),
              new MP3( "Watership Down" )
            )

    println( classifyItems( items ) )
  }

  def classifyItems( items:List[Item] ): List[String] = {

    // Use a for comprehension and pattern matching to take a list of
    // items and return a list of types of items.

    for (item <- items) { // <=== type mismatch;
        item match {
            case b: Book => println("Book")
            case d: DVD => println("DVD")
            case m: MP3 => println("MP3")
        }
    }

  }

}

错误消息:

error: type mismatch;
found   : Unit
 required: List[String]
    for (item <- items) {
              ^
one error found

1 个答案:

答案 0 :(得分:3)

以下是您的代码的工作版本:

abstract class Item

case class Book (title: String) extends Item
case class DVD (title: String) extends Item
case class MP3 (title: String) extends Item

val items = List( 
  Book( "The Hobbit" ),
  DVD( "Black Adder Goes Forth" ),
  MP3( "Watership Down" )
)

def classifyItems(items:List[Item]): List[String] = 
  for (item <- items) yield
    item match {
      case b: Book => "Book"
      case d: DVD => "DVD"
      case m: MP3 => "MP3"
      case _ => "else"
    }

验证它确实有效:

scala> classifyItems(items)
res2: List[String] = List(Book, DVD, MP3)    

一些评论:

  • 使用案例类时,您不必使用new
  • 您必须在yield语句后使用for语句。
  • 如果您不想在match中使用默认案例,则必须使用sealed traitsealed class
  • 有关Scala中for语句的更多信息:http://www.scala-lang.org/node/111