لماذا لا تحدد Treeset's Treeset's Java أن معلمة نوعها يجب أن تمتد قابلة للمقارنة؟

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

سؤال

على سبيل المثال الرمز أدناه يلقي classcastexception عند إضافة الكائن الثاني إلى Treeset. لا يمكن كتابة Treeset بحيث يمكن أن تكون المعلمة النوع فقط نوعًا قابلاً للمقارنة؟ بمعنى آخر لن يتم تجميع Treeset لأن الكائن غير قابل للمقارنة. وبهذه الطريقة ، يقوم الأدوية في الواقع بعملهم - لكونه نوعًا ما.

import java.util.TreeSet;
public class TreeSetTest {
  public static void main(String [] args) {
   TreeSet<Object> t = new TreeSet<Object>();
   t.add(new Object());
   t.add(new Object());
  }
}
هل كانت مفيدة؟

المحلول

إذا كان يجب أن يكون النوع قابلاً للمقارنة ، فلن تتمكن من إنشاء مجموعة من الأشجار بنوع غير قابل للاعماء ومقارن (وهو ما يمكنك الآن).

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

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

نصائح أخرى

TreeSet لا يتطلب أن تكون معلمة نوعها Comparable, ، لأنه يمكن أن يستغرق خارجيا Comparator لمقارنة غيرComparable القيم.

ذلك لأن القيمة تفعل ليس يجب أن تنفذ بالضرورة Comparable. يمكنك تمرير المجموعة أ Comparator الكائن بشكل صريح ، وفي هذه الحالة لا يحتاج نوع العنصر إلى أن يكون Comparable.

يمكنك أيضًا إنشاء ملف TreeSet مع Comparator كمعلمة مُنشأة. ثم لا يجب أن تكون العناصر الخاصة بك قابلة للمقارنة.

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