2010-11-26 13 views
6

Estoy tratando de volver a escribir https://gist.github.com/319827 para Scala. Pero no puedo compilarlo. ¿Cual es la sintaxis correcta?Scala, extensión genérica avanzada

error que estoy consiguiendo Allways: Tipo

clase necesaria, pero java.util.Comparator [_>: java.lang.Comparable [java.lang.Object]] encontró

fuente:

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

} 

Respuesta

2

he regresado al problema con más experiencia y solved it, aunque piensa que puede ser mejor

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 
    } 

} 
+0

no es seguro, puede obtener algunos errores de tiempo de ejecución ... – linehrr

+0

tiene razón, el método de aplicación no aplica algo como >. Pero esto podría ser cambiado. – v6ak

14

A extends B está escrito en Scala A<:B no A>:B

por cierto, sistema de tipo Scala es lo suficientemente potente como para evitar el uso de objetos (AnyRef en Scala) en el código

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

Bueno, no es exactamente el código que quiero. Realmente odio la especialización (como la especialización en ObjectPascal). – v6ak

+0

Puede escribir código menos especializado, pero perderá seguridad de tipo en tiempo de compilación. ¿De verdad quieres que te permita escribir código para comparar 'Fecha' con' Archivo' que solo fallará en el tiempo de ejecución? – shellholic

+0

Hmm, pero no es el caso del código original de Java. Creo que puedo escribir algo similar al código Java en Scala, pero no es muy bueno. – v6ak

2

Bueno, usted hizo alguna meterse con esa versión de Java. Observe que crea una instancia del Comparador < Comparable < Objeto >> y la asigna al valor con comodín, ¿para qué? No asignarás nada más a esa variable. El no hablar de que su getInstance también define wildecards, mientras que devuelve todo lo que la misma Comparador < comparable < Objeto >>

Así:

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

Es una forma que permite tener una sola instancia y usarla para varios tipos. Es de facto compatible, pero Java no tiene poder para explicarlo sin @SuppressWarning. No creo que sea un desastre. Tu código no es el código que quiero. El siguiente código no funciona: https://gist.github.com/d2d24794f61b5afb7d57 – v6ak

Cuestiones relacionadas