لماذا لا يتم تطبيق التحويل الضمني من طويل إلى ريتشلونج حيث يتوقع مجموعة من ريتشلونغ؟
-
01-10-2019 - |
سؤال
يقول Scala 2.8 SPEC في القسم 7.3 (تسليط الضوء على لي):
يمكن أن تحدد المعلمات والأساليب الضمنية أيضًا تحويلات ضمنية تسمى طرق العرض. يتم تعريف طريقة عرض من النوع S إلى النوع T بواسطة قيمة ضمنية لها نوع الوظيفة S => T أو (=> S) => T أو بواسطة طريقة قابلة للتحويل إلى قيمة لهذا النوع. يتم تطبيق وجهات النظر في حالتين.
- إذا كان التعبير E من النوع T و T. لا يتوافق إلى نوع التعبير المتوقع حزب العمال. في هذه الحالة ، يتم تفتيش V ضمنية ويطبق على E و الذي يتوافق نوع النتيجة إلى pt. يستمر البحث كما في حالة المعلمات الضمنية ، حيث يكون النطاق الضمني هو واحد من t => pt. إذا تم العثور على مثل هذا العرض ، يتم تحويل التعبير E إلى V (E).
[...]
بالنظر إلى ما سبق والحقائق التالية:
Long
ليس نوعا فرعيا منjava.lang.Comparable[Long]
, ، بمعنى آخر لا يتوافق لكتابةT
أينT <: java.lang.Comaparable[Long]
Predef
يحتوي علىimplicit def longWrapper (x: Long) : RichLong
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 لـ "عرض ملزمة").
لا تنتمي إلى StackOverflow