我有两个对象,ObjectA和ObjectB,都有一个update()方法,我想写一个函数,它只接受ObjectA或ObjectB(不接受其他类型),从概念上讲,这就是我要做的:
def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = { obj.update }
我知道还有其他方法可以解决这个问题(例如,update()方法的结构化类型,公共基类等),但我的问题是在Scala中是否可以这样做,如果可以,语法是什么?
i1icjdpr1#
在Scala中,有一个类型Either来创建一个不相交的并集。基本上,你会做如下操作:
def doSomething(obj: Either[ObjectA, ObjectB]) { obj.fold(fa, fb) }
checkout http://www.scala-lang.org/api/current/scala/Either.html
2wnc66cl2#
正如公认答案中提到的,Either非常适合您的问题以下是字段成员不相同时的解决方案
Either
def doSomething(obj: Either[ClassA, ClassB]): String = { obj match { case Left(objA) => objA.field1 case Right(objB) => objB.field2 } } doSomething(Left(new ClassA(field1="something"))) doSomething(Right(new ClassB(field2="somethingelse")))
当我们必须接受多种类型时,这里有一个解决方案
def doSomething[T](obj: T): String = { obj match { case objA: ClassA => objA.field1 case objB: ClassB => objB.field2 case objC: ClassC => objC.field3 } } doSomething(new ClassA(field1="something")) doSomething(new ClassB(field2="somethingelse")) doSomething(new ClassC(field3="another"))
2条答案
按热度按时间i1icjdpr1#
在Scala中,有一个类型Either来创建一个不相交的并集。基本上,你会做如下操作:
checkout http://www.scala-lang.org/api/current/scala/Either.html
2wnc66cl2#
正如公认答案中提到的,
Either
非常适合您的问题以下是字段成员不相同时的解决方案
当我们必须接受多种类型时,这里有一个解决方案