object Test extends Application {
// compiles:
Map[Int, Value](
0 -> KnownType(classOf[Object]),
1 -> UnknownValue())
// does not compile:
Map(
0 -> KnownType(classOf[Object]),
1 -> UnknownValue())
}
sealed trait Value {
def getType: Option[Class[_]]
}
case class UnknownValue() extends Value {
def getType = None
// compiles if changed to:
// def getType: Option[Class[_]] = None
}
case class KnownType(typ: Class[_]) extends Value {
def getType = Some(typ)
}
上述代码无法编译。编译器的错误信息是:为什么下面的Scala代码不能编译,除非显式的类型参数被添加?
Experiment.scala:10: error: type mismatch; found : (Int, KnownType) required: (Int, Product with Value{def getType: Option[java.lang.Class[_$2]]}) where type _$2 0 -> KnownType(classOf[Object]), ^ one error found
如果我改变的UnknownValue
方法声明为def getType: Option[Class[_]] = None
再也不用类型参数地图()编译。
为什么?
这是重现问题的最小示例。在真实的代码中还有其他的案例类,所以它不仅仅是重新发明Option。 – 2009-06-24 23:35:40