لماذا لا ترجمة التعليمات البرمجية سكالا التالية ما لم تتم إضافة المعلمات نوع صريح؟

StackOverflow https://stackoverflow.com/questions/1038183

  •  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))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top