tipos tipo puede programacion para implícitamente implicita float datos convertir conversion cast scala collections implicit-conversion

scala - programacion - ¿Cómo pueden las colecciones usar conversiones implícitas en los tipos de elementos?



no se puede convertir implícitamente el tipo double en float (2)

scala> implicit def ordering[T <% Ordered[T]] = new Ordering[T]{def compare(x: T, y: T) = x compare y} ordering: [T](implicit evidence$1: (T) => Ordered[T])java.lang.Object with Ordering[T] scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T]

Mientras trabajaba en esta pregunta , se me ocurrió el siguiente problema. Considere dos definiciones de métodos:

def foo[T <: Ordered[T]](s : Seq[T]) = s.sorted def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted

El primero compila, el segundo no. El compilador no se da cuenta de que puede usar la conversión implícita declarada para obtener un Ordering . Si ayudamos un poco, funciona:

def foo[T <% Ordered[T]](s : Seq[T]) = s.sortWith(_<=_)

Al compilar la función anónima, el compilador aplica la conversión implícita para encontrar el método <= , todo está bien.

No tengo otro ejemplo, pero puedo imaginar problemas similares con otras funciones en las colecciones que requieren elementos para tener ciertas propiedades, si solo pueden afirmarse a través de la conversión.

¿Hay alguna razón particular por la cual el compilador está restringido de esta manera? ¿No hay una forma general de resolver estos problemas? (Aquí parece fácil.) ¿Hay una solución, por ejemplo, otra conversión implícita que traduce la propiedad en la Key[T] a T ?

(Tenga en cuenta que la última idea puede ser problemática si un valor concreto para T termina teniendo la propiedad, entonces obtenemos una situación ambigua).


% scala29 Welcome to Scala version 2.9.0.r24168-b20110202012927 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22). Type in expressions to have them evaluated. Type :help for more information. scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted foo: [T](s: Seq[T])(implicit evidence$1: (T) => Ordered[T])Seq[T] scala>

Por cierto, re "aquí parece fácil", no fue así. Implicits como estos disfrutan divergiendo y eran bastante determinados.