scala - Union type with upper bound -
i next technique presented in accepted reply question does scala have "type disjunction" (union types)? in order back upwards type checking multiple-type parameter method.
the implicit "evidence"
@implicitnotfound(msg="only string, array[byte] , inputstream supported") sealed class input[t] object input{ implicit object bytearraywitness extends input[array[byte]] implicit object stringwitness extends input[string] implicit object inputstreamwitness extends input[inputstream] }
the api method
def foo[t: input](param: t) = param match { case x: string => //... case x: array[byte] => //... case x: inputstream => //... case _ => throw new unsupportedoperationexception(s"not implemented type ${param.getclass}") }
the problem
this compiles
foo("test") foo(array[byte](123.tobyte))
but not (because it's not concrete inputstream
)
foo(new bytearrayinputstream("abc".getbytes("utf-8")))
i have cast exact super type create work (this compiles)
foo(new bytearrayinputstream("abc".getbytes("utf-8")).asinstanceof[inputstream])
is there way alter
implicit object inputstreamwitness extends input[inputstream]
so evidence extends inputstream
? have feeling there upper bound <:
notation plug in somewhere, don't know where...
or "crazy lambda calculus stuff" highest voted reply aforementioned question comes rescue?
make input
contra variant in type t
like: input[-t]
, means if super type of b, input[b] super type of input[a] (reverse "inheritance"). in case means input[inputstream] knows how handle subclasses input type inputstream
(like bytearrayinputstream
)
i explanation on contravariance rex kerr in this question. there many others
scala types
No comments:
Post a Comment