blob: 55a3b74e4cadacb5f87a5ba680da04830b7f9eca (
plain) (
tree)
|
|
class YouAreYourself[A <: AnyRef](val you: A) extends AnyVal {
def yourself: you.type = you
}
object Test {
val s = ""
val s1: s.type = new YouAreYourself[s.type](s).yourself
}
trait Path {
type Dep <: AnyRef
}
final class ValueClass[P <: Path](val path: P) extends AnyVal {
import path.Dep
def apply(dep: Dep)(d2: dep.type, foo: Int): (Dep, d2.type) = (d2, d2)
// This generates dodgy code; note `ValueClass.this`:
//
// final def bounds$extension[D >: Nothing <: ValueClass.this.path.Dep,
// P >: Nothing <: Path]
// ($this: ValueClass[P])
// (dep: D)
// (d2: dep.type, foo: Int): (D, d2.type) = scala.Tuple2.apply[D, d2.type](d2, d2);
//
// Nothing crashes down the line, but it certainly doesn't conform to best-practices.
//
// An better alternative would be to add a type parameter for the (singleton) type of
// the wrapped value.
def bounds[D <: Dep](dep: D)(d2: dep.type, foo: Int): (D, d2.type) = (d2, d2)
}
|