عند استخدام تدوينات التباين أو الحدود العامة في سكالا

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

سؤال

في تباين Scala يمكن تعريفها مع مشغلي التباين مثل + و - على وسيطة النوع العام. على سبيل المثال List النوع متغير في المكتبة القياسية.

class List[+A]

لذلك يمكن تعريف وظيفة مع قائمة المتغيرات مثل هذا:

def foo[A](list : List[A])

كما يمكن محاكاة التباين مع حدود عامة. لذلك يمكننا أيضًا كتابة هذا

def foo[A](list : List[_:< A])

بالطبع هذا لا معنى له ، لأن list متغير بالفعل. ولكن يمكن القيام بنفس الخدعة لأنواع غير متغيرة. (مثل Stack). بالطبع ، يمكن أيضًا إنشاء أنواع جديدة من Stack (ميراث التجميع) المتغير.

لذلك أسئلتي:

  1. متى يجب استخدام الحدود العامة للتباين؟ ومتى يجب أن ننشئ نوعًا جديدًا متغيرًا؟
  2. هي الحدود العامة مفيدة فقط للتباين ، أو هل يمكن أن تعلن المزيد (مفاهيم اللغة).
  3. إذا كانت مفيدة فقط للتباين ، فهي حدود ثم فقط للتوافق مع Java؟

شكرا مقدما :)

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

المحلول

إذا كان النوع متغيرًا بشكل طبيعي أو مخالف ، فيجب عليك إعلان ذلك. سوف يشكرك المستخدمون على ذلك. تباين موقع الاستخدام موجود بالفعل في الغالب بسبب جافا. بتعبير أدق ، نوع مثل Array[T <: Number] يعامل على أنه اختصار لنوع وجودي:

ArrayBuffer[T] forSome { type T <: Number }

الأنواع الوجودية لها بناء جملة ضخمة في Scala. هذا أمر مقصود ، لأننا لا نوصيك باستخدامها كثيرًا. متى ستحتاج إلى نوع وجودي؟

  1. لكتابة التناظرية لنوع جافا مع أحرف البرية ، مثل List<? extends Number>.
  2. لكتابة التناظرية من نوع Java Raw ، مثل List.

في Java ، لا تكون الأنواع الأولية وأنواع البطاقات البرية هي نفسها تمامًا ولا تشبه تمامًا نوع الوجود (على الرغم من أننا نعرف ما هي عليه ، فمن الصعب للغاية تحديد ما هي عليه على وجه التحديد). لكنها قريبة بما يكفي للوجودي في الممارسة العملية ، بحيث تفلت سكالا مع رسم خرائط لها إلى هذا النوع من النوع.

نصائح أخرى

  1. عند إنشاء نوع عام جديد ، قل foo [t] ، يجب أن تحاول بجد تحديد ما إذا كان هذا النوع متغيرًا أو متناقضًا أو ثابتًا وإعلانه foo [+t] أو foo [-t] أو foo [t] على التوالي. من المسلم به أن هذا يمكن أن يكون صعبا بعض الشيء. ومع ذلك ، فإنه يحرر من مستخدم اتخاذ هذا القرار في كل مرة تحتاج فيها إلى استخدام FOO باستخدام الحدود العامة. باختصار: تفضل تباين موقع الإعلان على تباين موقع الاتصال عندما يكون التباين خاصية من النوع نفسه.

راجع للشغل ، فإن البرمجة في كتاب سكالا من تأليف مارتن أودرسكي وليكس سبون وبيل فينز لديها بعض الوظائف البحرية الرائعة حول التباين. انظر الفصل 19 نوع المعلمة.

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