Scala, расширенное расширенное расширение - PullRequest
10 голосов
/ 26 ноября 2010

Я пытаюсь переписать 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 ]

18 голосов
/ 26 ноября 2010

A extends B написано A<:B в Scala, а не A>:B

Кстати, система типов Scala достаточно мощная, чтобы избежать использования Object (AnyRef в 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
}
3 голосов
/ 26 ноября 2010

Ну, вы сделали какой-то беспорядок с этой версией Java. Обратите внимание, что вы создаете экземпляр Comparator > и присваиваете ему значение с подстановочным знаком - зачем? Вы не будете назначать что-либо еще этой переменной. Не говоря о том, что ваш getInstance также определяет wildecards, в то время как он возвращает все то же 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);
    }
}
2 голосов
/ 26 февраля 2011

Я вернулся к проблеме с большим опытом и решил ее , хотя я думаю, что это может быть лучше.

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
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...