لماذا لا يتم تطبيق التحويل الضمني من طويل إلى ريتشلونج حيث يتوقع مجموعة من ريتشلونغ؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

يقول Scala 2.8 SPEC في القسم 7.3 (تسليط الضوء على لي):

يمكن أن تحدد المعلمات والأساليب الضمنية أيضًا تحويلات ضمنية تسمى طرق العرض. يتم تعريف طريقة عرض من النوع S إلى النوع T بواسطة قيمة ضمنية لها نوع الوظيفة S => T أو (=> S) => T أو بواسطة طريقة قابلة للتحويل إلى قيمة لهذا النوع. يتم تطبيق وجهات النظر في حالتين.

  1. إذا كان التعبير E من النوع T و T. لا يتوافق إلى نوع التعبير المتوقع حزب العمال. في هذه الحالة ، يتم تفتيش V ضمنية ويطبق على E و الذي يتوافق نوع النتيجة إلى pt. يستمر البحث كما في حالة المعلمات الضمنية ، حيث يكون النطاق الضمني هو واحد من t => pt. إذا تم العثور على مثل هذا العرض ، يتم تحويل التعبير E إلى V (E).

[...]

بالنظر إلى ما سبق والحقائق التالية:

  1. Long ليس نوعا فرعيا من java.lang.Comparable[Long], ، بمعنى آخر لا يتوافق لكتابة T أين T <: java.lang.Comaparable[Long]
  2. Predef يحتوي على implicit def longWrapper (x: Long) : RichLong
  3. RichLong هو نوع فرعي من java.lang.Comparable[Long], ، بمعنى آخر يتوافق لكتابة T أين T <: java.lang.Comaparable[Long]

أتوقع أن يتم تطبيق التحويل الضمني حيث Long تمت مواجهته ونوع فرعي من java.lang.Comparable[Long] متوقع. لكن:

scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
test: [T <: java.lang.Comparable[Long]](c: T)Unit

scala> test(12L)
<console>:7: error: inferred type arguments [Long] do not conform to method test's type parameter bounds [T <: java.lang
.Comparable[Long]]
       test(12L)
       ^

النتيجة كما هو متوقع إذا تم تحويل القيمة بشكل صريح:

scala> test(longWrapper(12L))
12

لماذا لا يتم تطبيق وظيفة التحويل ضمنيًا؟

هل كانت مفيدة؟

المحلول

تحتاج إلى استخدام عرض العرض (<%) لجعل المترجم يبحث عن التحويل الضمني وتطبيقه.

scala> def test[T <% java.lang.Comparable[Long]](c: T) = println(c)
test: [T](c: T)(implicit evidence$1: (T) => java.lang.Comparable[Long])Unit

scala> test(12L)
12

يمكنك قراءة المزيد حول عرض العرض هذه الصفحة (Ctrl+F لـ "عرض ملزمة").

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top