لماذا لا تحدد Treeset's Treeset's Java أن معلمة نوعها يجب أن تمتد قابلة للمقارنة؟
-
26-09-2019 - |
سؤال
على سبيل المثال الرمز أدناه يلقي 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
كمعلمة مُنشأة. ثم لا يجب أن تكون العناصر الخاصة بك قابلة للمقارنة.