有谁知道为什么以下代码无法通过编译?我只是不知道为什么会发生类型不匹配。
输出应如下所示:
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
答案 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 trait
或sealed class
for
语句的更多信息:http://www.scala-lang.org/node/111