我很感兴趣,如果我可以创建方法与类似的想法:
def myMethod[T](param: T)(implicit oneOf: Either[TypeClass1[T], TypeClass2[T]]) = oneOf match ...
我试过使用默认参数(我在akka中看到过类似的东西):
def myMethod[T](param: T)(implicit t1: TypeClass1[T] = null, t2: TypeClass2[T] = null) =
if (t1 == null) ...
然而,这样我就不能强迫scala编译器至少找到其中的一个。
此外,我还实现了从TypeClass1[T]
到Left[TypeClass1[T], TypeClass2[T]]
以及从TC2
到Right
的隐式转换,但是Scala编译器忽略了这些转换。
有没有办法做到这一点?
3条答案
按热度按时间kfgdxczn1#
显而易见的解决方案是创建一个可以使用
TypeClass1
或TypeClass2
构造的新类型类。新类型类实现了myMethod
使用的功能,该功能对两者是通用的,并将其Map到TypeClass1
或TypeClass2
上的适当方法。以下是一个示例:
这将打印
4dbbbstv2#
在Scala 3中,您可以像这样使用union type
332nm8kg3#
您可以使用其中一个库中的标准
shapeless.OrElse
或implicitbox.Priority
或implicitlogic.Or
https://github.com/milessabin/shapeless
https://github.com/monix/implicitbox
https://github.com/Jasper-M/implicitlogic
类型类
OrElse
、Priority
类似于**@Tim**的答案中的UnionTypeClass
,但它们优先考虑t1
、t2
。