4

谁能知道为什么下面的代码不能通过编译?我只是不知道为什么会发生类型不匹配。

输出应如下所示:

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
4

1 回答 1

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,则必须使用 asealed trait或 asealed class
  • for有关Scala中声明的更多信息: http ://www.scala-lang.org/node/111
于 2012-10-06T17:00:28.387 回答