الأدوية جافا:كيفية يلقي ل (ر يمتد مقارنة<?سوبر تي>) دون أنواع الخام

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

سؤال

وأتساءل عما إذا كان من الممكن أن يلقي غير قابلة للمقارنة إلى شيء بحيث يطابق المعلمة طريقة ر التي لديها نوع القالب <T extends Comparable<? super T>>, ، مثل ال Collections.sort() الطريقة

public static <T extends Comparable<? super T>> void sort(List<T> list)

لنفترض أن لدي في مكان ما إشارة إلى قائمة غير قابلة للمقارنة وأريد استدعاء هذه الطريقة عن طريق الإرسال مثل هذا:

List<E> foo = new List<E>(a);
Collections.sort( /* magic cast */ foo);

أستطيع أن أفعل هذا إذا كنت يلقي ل (List<? extends Comparable>), ، ولكن هذا يولد تحذيرا بأنني أستخدم أنواعا أولية (قابلة للمقارنة بدون أنواع القوالب في هذه الحالة).لنفترض أنني أريد تجنب استخدام الأنواع الخام أو حتى قمعها عبر @SuppressWarnings("rawtypes") (على سبيل المثال.للحفاظ على التوافق مع الإصدارات السابقة وتجنب الأنواع الخام).

هل من الممكن تجنب استخدام الأنواع الخام عن طريق الصب إلى (List<? extends Comparable</*something*/>>) وماذا سيكون أن "شيئا" (يلقي دون رادع غير مقبول)?

تحرير:هذا المثال هو فقط لتوضيح هذه النقطة.في الواقع ليس لدي مقارنة ولا أريد فرز أي شيء ، ولكن أنا فقط بحاجة إلى التحقق ديناميكيا ما إذا كان هناك شيء من نوع ما (مقارنة في هذا المثال) (عبر إنستانسوف) ومن ثم تمرير بعض الوسيطة إلى طريقة التي لديها وسائط قالب مماثلة ل Collections.sort() الطريقة.

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

المحلول

يلقي ذلك إلى

Collections.sort((List<Comparable<Object>>) list);

هذا لن يعطي تحذيرات" راوتيب".تحذير واحد فقط "غير محدد" (والذي ستحصل عليه على أي حال.)

انطلاقا مما ذكرته في تحرير, في النهاية تريد أن تفعل شيئا كهذا?

if(!list.isEmpty() && list.get(0) instanceof Comparable){
    List<Comparable<Object>> cmprList = (List<Comparable<Object>>)list;
    Collections.sort(cmprList);
}

نصائح أخرى

هذا بالتأكيد غير ممكن. Collections.sort يتطلب Comparable من أجل استدعاء compareTo() الطريقة.حتى في أوبينيون الخاص بك, ما ينبغي أن يحدث عندما فرز الحصول على مجموعة من الكائنات غير قابلة للمقارنة?

قد يكون أنك تريد استخدام شيء مثل الترتيب الافتراضي ، استنادا إلى المراجع على سبيل المثال.لكن مثل هذا الشيء غير موجود ضمنيا.على الرغم من أنه يمكن تنفيذها.ولكن أشك في أن هذا هو ما تريد?فلماذا تريد فرز القائمة في المقام الأول?وكيف يجب فرز هذه العناصر?

هذا سوف يجمع في الكسوف:

List<?> foo = new ArrayList<Object>();
Collections.sort((List<Comparable>) foo);

سوف تحصل على " نوع السلامة:غير محدد " تحذير أنه يمكنك قمع مع هذا:

@SuppressWarnings("unchecked")

سيتيح لك ذلك الاتصال بالفرز.هل هذا ما تبحث عنه?لا توجد ضمانات بأنها ستكون آمنة في وقت التشغيل ، بالطبع.

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