El tipo <:<
se define en Predef.scala junto con los tipos relacionados =:=
y <%<
como sigue:
// used, for example, in the encoding of generalized constraints
// we need a new type constructor `<:<` and evidence `conforms`, as
// reusing `Function2` and `identity` leads to ambiguities (any2stringadd is inferred)
// to constrain any abstract type T that's in scope in a method's argument list (not just the method's own type parameters)
// simply add an implicit argument of type `T <:< U`, where U is the required upper bound (for lower-bounds, use: `U <: T`)
// in part contributed by Jason Zaugg
sealed abstract class <:<[-From, +To] extends (From => To)
implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x} // not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit)
Este utiliza la característica de Scala que un genérico tipo op[T1, T2]
puede escribirse T1 op T2
. Esto se puede usar, como lo señala aioobe, para proporcionar un parámetro de evidencia para los métodos que solo se aplican a algunas instancias de un tipo genérico (el ejemplo dado es el método toMap
que solo se puede usar en un Traversable
de Tuple2
). Como se señala en el comentario, esto generaliza una restricción de tipo genérico normal para permitir que se refiera a cualquier parámetro de tipo/tipo abstracto dentro del alcance. Usar esto (implicit ev : T1 <:< T2
) tiene la ventaja de simplemente usar un parámetro de evidencia como (implicit ev: T1 => T2
) en el sentido de que este último puede conducir a valores implícitos no intencionales dentro del alcance que se utilizan para la conversión.
Estoy seguro de que he visto un debate sobre esto en una de las listas de correo de Scala, pero no puedo encontrarlo en este momento.
¿Se refiere al método de 'Manifest' o la clase definida en' Predef'? –
Eso se conoce como el operador "Madonna vistiendo una camisa con botones". – Syntactic
Ha, lo estoy llamando el operador "Angry Donkey" –