object Generic extends Serializable
The companion object for the Generic trait provides a way of obtaining a Generic[T] instance for some T. In addition, it defines Generic.Aux, which is an important implementation technique that can be generally useful.
- Alphabetic
- By Inheritance
- Generic
- Serializable
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Type Members
- type Aux[T, Repr0] = Generic[T] { type Repr = Repr0 }
Provides a representation of Generic[T], which has a nested Repr type, as a type with two type parameters instead.
Provides a representation of Generic[T], which has a nested Repr type, as a type with two type parameters instead.
This is useful for two reasons. First, it's surprisingly easy to wind up with a Generic type that has lost the refinement that carries the crucial Generic.Repr type, a problem which Generic.Aux prevents.
More importantly, Aux allows us to write code like this:
def myMethod[T, R]()(implicit eqGen: Generic.Aux[T,R], repEq: Eq[R]) = ???
Here, we specify T, and we find a Generic.Aux[T,R] by implicit search. We then use R in the second argument. Generic.Aux[T, R] is exactly equivalent to Generic[T] { type Repr = R }, but Scala doesn't allow us to write it this way:
def myMethod[T, R]()(eqGen: Generic[T] { Repr = R }, reqEq: Eq[egGen.Repr]) = ???
The reason is that we are not allowed to have dependencies between arguments in the same parameter group. So Aux neatly sidesteps this problem.
The "Aux pattern" is now in use in several other libraries as well, and is a useful general technique.
Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- def apply[T](implicit gen: Generic[T]): Aux[T, Repr]
Provides an instance of Generic.
Provides an instance of Generic. Prefer this over finding one with
implicitly
, or else usethe
.Either of these approaches preserves the Repr type refinement, which
implicitly
will lose. - final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def instance[T, R](f: (T) => R, g: (R) => T): Aux[T, R]
Creates a new Generic instance from a pair of functions.
Creates a new Generic instance from a pair of functions.
The functions
f
andg
should be the inverse of each other, i.e.f(g(x)) == x
g(f(y)) == y
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- implicit macro def materialize[T, R]: Aux[T, R]
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()