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)
}
Le code ci-dessus ne peut pas être compilé. Le message d'erreur du compilateur est:Pourquoi le code Scala suivant ne compile pas, sauf si des paramètres de type explicites sont ajoutés?
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
Si je change la déclaration de méthode de UnknownValue
être def getType: Option[Class[_]] = None
puis aussi la carte() sans paramètres de type compile.
Pourquoi?
Ceci est un exemple minimal pour reproduire le problème. Dans le code réel, il existe également d'autres classes de cas, donc il ne s'agit pas simplement de réinventer Option. –