12

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);
    }

}
4

3 に答える 3

19

A extends BA<:Bscalaで書かれていないA>:B

ちなみに、scala 型システムは、コード内で Object (scala では AnyRef) を使用しないようにするのに十分強力です。

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
}
于 2010-11-26T13:24:58.477 に答える
3

さて、あなたはそのJavaバージョンを台無しにしました。Comparator< Comparable< Object>> のインスタンスを作成し、それをワイルドカードを使用して値に割り当てていることに注意してください。その変数には他に何も割り当てません。あなたの getInstance もワイルドカードを定義しているとは言いませんが、すべて同じ Comparator< Comparable< Object>> を返します

そう:

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);
    }
}
于 2010-11-26T13:25:52.017 に答える
2

私はより多くの経験を積んで問題に戻り、それを解決しましたが、それはより良いことだと思います。

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
    }

}
于 2011-02-26T20:25:16.257 に答える