هل يمكنني تحويل التعليمات البرمجية التالية إلى استخدام الأدوية?

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

  •  09-06-2019
  •  | 
  •  

سؤال

أنا تحويل الطلب إلى استخدام جافا 1.5 و قد وجدت الطريقة التالية:

  /**
   * Compare two Comparables, treat nulls as -infinity.
   * @param o1
   * @param o2
   * @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2
   */
  protected static int nullCompare(Comparable o1, Comparable o2) {
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      } else {
        return -1;
      }
    } else if (o2 == null) {
      return 1;
    } else {
      return o1.compareTo(o2);
    }
  }

ومن الناحية المثالية كنت ترغب في جعل طريقة اتخاذ اثنين المتماثلة من نفس النوع, هل من الممكن تحويل هذا و كيف ؟

ظننت التالية سوف تفعل خدعة:

protected static <T extends Comparable> int nullCompare(T o1, T o2) {

ولكنه فشل في التخلص من تحذير في IntelliJ "دون رادع الدعوة إلى 'compareTo(T)' كعضو الخام نوع 'جافا.لانغ.للمقارنة'" على الخط:

return o1.compareTo(o2);
هل كانت مفيدة؟

المحلول

تغييره إلى:

protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {

كنت بحاجة إلى ذلك لأن للمقارنة هو في حد ذاته نوع عام.

نصائح أخرى

هنا حالة غريبة:

static class A {
    ...
}

static class B extends A implements Comparable<A> {
    public int compareTo(A o) {
        return ...;
    }
}

لحسن الحظ رمز مثل واحد أعلاه هو نادر ولكن nullCompare() لن تدعم مقارنة Bs إلا أنه مماثلة قد تنطبق T أو أي الفائقة منه:

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

على الرغم من أن معظم الناس لن تستفيد من فوق قرص ، قد تأتي في متناول اليدين عند تصميم واجهات برمجة التطبيقات المصدرة المكتبات.

لا يمكن تحرير لذا يجب أن آخر جوابي.

تحتاج إلى تعلن متداخلة نوع المعلمة منذ للمقارنة هو عام.

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

يرجى ملاحظة أن للمقارنة< ?سوبر T >, مما يجعل أكثر مرونة.سوف نرى نفس طريقة التعريف على مجموعات.نوع

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

أنا لست متأكدا من أن genericizing هذا الأسلوب المنطقي.حاليا الأسلوب يعمل على أي نوع من المقارنة ، إذا كنت genericize أنه سيكون لديك لتنفيذ ذلك (مع بالضبط نفس القانون) عدة مرات.في بعض الأحيان أنه من الممكن المقارنة بين اثنين من الكائنات التي لا لها سلف مشترك ، أي عام الإصدار لن تسمح بذلك.

بإضافة الأدوية لن تضيف أي السلامة من المدونة ؛ أي مشاكل السلامة سوف تحدث في الدعوة إلى compareTo.ما أود أن أقترح هو ببساطة قمع التحذير.انها ليست حقا تحذير لكم عن أي شيء مفيد.

لجعله أكثر العامة ، يمكن حتى تسمح له بالعمل لمدة سنتين أنواع مختلفة.=P

  /**
   * Compare two Comparables, treat nulls as -infinity.
   * @param o1
   * @param o2
   * @return -1 if o1&lt;o2, 0 if o1==o2, 1 if o1&gt;o2
   */
  protected static <T> int nullCompare(Comparable<? super T> o1, T o2) {
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      } else {
        return -1;
      }
    } else if (o2 == null) {
      return 1;
    } else {
      return o1.compareTo(o2);
    }
  }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top