لماذا لا تنفذ التجريدة equals ()؟
-
19-08-2019 - |
سؤال
هل كنت تعلم هذا :
Map<Object,Object> m1 = new HashMap<Object, Object>();
Map<Object,Object> m2 = new HashMap<Object, Object>();
System.out.println("m1.equals(m2) = "+m1.equals(m2));
System.out.println("m1.keySet().equals(m2.keySet()) = "
+m1.keySet().equals(m2.keySet()));
System.out.println("m1.entrySet().equals(m2.entrySet()) = "
+m1.entrySet().equals(m2.entrySet()));
System.out.println("m1.values().equals(m2.values()) = "
+m1.values().equals(m2.values()));
سوف الإخراج:
m1.equals(m2) = true
m1.keySet().equals(m2.keySet()) = true
m1.entrySet().equals(m2.entrySet()) = true
m1.values().equals(m2.values()) = false
هذا ناتج عن حقيقة أن AbstractCollection
(أيّ HashMap$Values
يرث من) لا يتجاوز #equals()
.
هل لديك فكرة لماذا هذا؟
المحلول
حسب عقد Collection#equals()
, ، لا يوجد غرض عام متساوي () أساليب ل Collection
S ، وبالتالي AbstractCollection
لا يمكن توفير واحدة.
لاحظ أن HashMap$Values
ليست مجموعة ولا قائمة ، وبالتالي المأزق وبسبب ما لا يدعمها equals()
.
نصائح أخرى
تمديد كل من AbstractList و Abstractset AsstractCollection ، ولديهما سلوكيات مختلفة لطرق المساواة () ، المحددة بواسطة الواجهات قائمة و تعيين. الواجهة ل مجموعة يقول:
بينما لا تضيف واجهة التجميع أي شروط إلى العقد العام للكائن. إذا اختاروا تجاوز الكائن.
لذلك يجب أن لا تتأثر مجردة Collection بالتأكيد (). ومع ذلك ، لا أعرف حقًا لماذا لن تنفذ قيم HashMap $ متساوية () نفسها.
لست متأكدًا مما إذا كان هذا هو السبب الرسمي ، لكن AbstractCollection يتجنب إضافة قيود دلالية على الفئات الفرعية المحتملة. يتم تحديد دلالات المساواة من خلال طبيعة بنية بيانات الوراثة الملموسة ، وعلى وجه الخصوص بناءً على ما إذا كان بنيتك قد تم طلبه وما إذا كان يسمح بالتكرار.
على سبيل المثال ، فكر في Treeset ، LinkedList ، حقيبة ، إلخ.
راجع للشغل ، فيما يتعلق بالرمز الذي نشرته ، ما هو النوع الفعلي لأي شيء يتم إرجاعه بالقيم؟ يجب أن يكون ذلك فئة فرعية مع تطبيق ملموس .. إذا كانت خريطتك فارغة عند تشغيل هذا الرمز ، فمن المحتمل أن تنتهي بشيء لا يعتبر مجموعتين فارغتين متساويتين.