لماذا لا ترجمة التعليمات البرمجية سكالا التالية ما لم تتم إضافة المعلمات نوع صريح؟
-
10-07-2019 - |
سؤال
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)
}
ورمز أعلاه يفشل في ترجمة. رسالة خطأ المترجم هي:
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
ثم أيضا خريطة () بدون معلمات نوع يجمع.
لماذا؟
المحلول 3
ونشرت لي السؤال في القائمة البريدية للمستخدم سكالا وقالوا أيضا إنهم أنه من الشوائب.
نصائح أخرى
وهم، وهذا هو غريب. يبدو وكأنه علة لي.
وطريقة واحدة يمكنك إصلاحه هو من خلال إعطاء القيمة قيمة افتراضية لgetType، وعندئذ فقط تجاوز في KnownType. مثل ذلك:
sealed trait Value {
def getType: Option[Class[_]] = None
}
case object UnknownValue extends Value
case class KnownType(typ: Class[_]) extends Value {
override def getType = Some(typ)
}
ولكن هذا يبدو مثير للريبة وكأنك إعادة اختراع الخيار. فما استقاموا لكم فاستقيموا تخطي اكتب القيمة تماما، ومجرد استخدام الخيارات على التوالي.
Map(
0 -> Some(classOf[Object]),
1 -> None)
إذا كنت لا تحب كتابة الخيار [الفئة [_]] في كل مرة كنت أتوقع واحدة من هذه الخرائط، يمكنك إنشاء اسم مستعار له:
type Value = Option[Class[_]]
ويبدو بالفعل ان الخلل، ولكن هناك العديد من القضايا مع نوع الاستدلال التي يمكن بسهولة أن عمل حول بإعطائه القليل من المساعدة. وتجمع مثل هذا:
Map(
0 -> KnownType(classOf[Object]),
1 -> (UnknownValue() : Value))