Scala,高级通用扩展

v6a*_*6ak 10 generics scala extending

我正在尝试将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);
    }

}
Run Code Online (Sandbox Code Playgroud)

she*_*lic 18

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
}
Run Code Online (Sandbox Code Playgroud)


v6a*_*6ak 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
    }

}
Run Code Online (Sandbox Code Playgroud)