سؤال

أحاول إعادة الكتابة https://gist.github.com/319827 إلى Scala. لكن لا يمكنني تجميعها. ما هو بناء الجملة الصحيح؟

خطأ أنا على ما يرام:

نوع الفصل المطلوب ولكن java.util.comparator [_>: java.lang.comparable [java.lang.object]

مصدر:

package v6ak.util

import java.util.Comparator

object NaturalComparator extends Comparator[_ >: Comparable[Object]]{

    override def compare(o1:Comparable[Object], o2:Comparable[Object]) = {
        if( o1==null || o2==null ){
            throw new NullPointerException("Comparing null values is not supported!");
        }
        o1.compareTo(o2);
    }

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

المحلول 3

لقد عدت إلى المشكلة بمزيد من الخبرة و حلها, ، على الرغم من أنني أعتقد أن هذا يمكن أن يكون أفضل.

package v6ak.util

import java.util.Comparator

object NaturalComparator extends Comparator[Comparable[Any]]{

    def apply[T]() = asInstanceOf[Comparator[T]]

    override def compare(o1:Comparable[Any], o2:Comparable[Any]) = {
        if( o1 == null || o2 == null ){
            throw new NullPointerException("Comparing null values is not supported!")
        }
        o1 compareTo o2
    }

}

نصائح أخرى

A extends B هو مكتوب A<:B في سكالا لا A>:B

بالمناسبة ، نظام Scala Type قوي بما يكفي لتجنب استخدام الكائن (أي aneref في Scala) في الكود الخاص بك

package v6ak.util

import java.util.Comparator

class NaturalComparator[T <: Comparable[T]] extends Comparator[T] {
  override def compare(o1: T, o2: T) = {
    if (o1 == null || o2 == null) {
      throw new NullPointerException("Comparing null values is not supported!");
    }
    o1.compareTo(o2);
  }
}

object StringComparator extends NaturalComparator[String]

object Examples {
  StringComparator.compare("a", "b")
  StringComparator.compare(2, "b") // error
}

حسنًا ، لقد قمت ببعض الفوضى مع إصدار Java. لاحظ أنك تقوم بإنشاء مثيل للمقارنة <قابلة للمقارنة <Object>> وتعيينه إلى القيمة باستخدام Wildcard - ماذا عن؟ لن تقوم بتعيين أي شيء آخر لهذا المتغير. لا تتحدث عن أن getInstance تحدد أيضًا بطاقات برية ، بينما تُرجع كل شيء نفس المقارنة <كائن >>

لذا:

object NaturalComparator extends Comparator[Comparable[Object]]{
    override def compare(o1:Comparable[Object], o2:Comparable[Object]) = {
        if(o1 == null || o2 == null){
            throw new NullPointerException("Comparing null values is not supported!");
        }
        o1.compareTo(o2);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top