2010-11-26 3 views
6

Я пытаюсь переписать https://gist.github.com/319827 в Scala. Но я не могу его скомпилировать. Каков правильный синтаксис?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); 
    } 

} 

ответ

2

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

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 
    } 

} 
14

A extends B написано A<:B в Скале не A>:B

, кстати, тип системы 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 
} 
+0

Ну, это не совсем тот код, который я хочу. Я действительно ненавижу специализацию (например, специализация в ObjectPascal). – v6ak 2010-11-28 09:12:14

+0

Вы можете написать менее специализированный код, но вы потеряете безопасность типа во время компиляции. Вы действительно хотите, чтобы вам разрешалось писать код для сравнения `Date` с` File`, который будет работать только во время выполнения? – shellholic 2010-11-28 15:12:18

+0

Хм, но это не относится к исходному Java-коду. Я думаю, что я могу написать что-то похожее на Java-код в Scala, но это не очень приятно. – v6ak 2010-12-03 10:26:50

2

Ну, вы сделали какой-то бардак с этой Java версии. Обратите внимание, что вы создаете экземпляр Comparator < Сопоставимый < Объект >> и вы назначаете его значение с помощью подстановочного знака - зачем? Вы не будете назначать что-либо еще этой переменной. Не говорите, что ваш деЫпзЬапс также определяет wildecards, в то время как он возвращает все то же самое компаратор < < Сопоставимых 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); 
    } 
}