generics - Very weird type mismatch in Scala -
why error when firing printgenerictype(new box[master]())
, , not error in case if run printgenerictype(new box())
on new box[master]()
?
object varianceexample extends app { new box[master]().printgenerictype(new box()) // ok new box().printgenerictype(new box[master]()) // fail } class box[t >: tool](implicit m: manifest[t]) { def printgenerictype(box: box[t]) = { println(s"generic type [$m] - $box") } } class master class tool extends master class hammer extends tool
you need define type t
covariant, otherwise can pass same type used in constructor. new box()
- gives box[tool]
(without other constraints) , trying pass box[master]
.
in first example scalac automatically infers new box()
box[master]
because it's in box[master]
position.
not sure want achieve, solve concrete problem need define type box this:
class box[+t >: tool](implicit m: manifest[t]) { def printgenerictype[a >: t](box: box[a]) = { println(s"generic type [$m] - $box") } }
Comments
Post a Comment