在scala中接受多种类型的参数

j8ag8udp  于 2022-12-18  发布在  Scala
关注(0)|答案(2)|浏览(158)

我有两个对象,ObjectA和ObjectB,都有一个update()方法,我想写一个函数,它只接受ObjectA或ObjectB(不接受其他类型),从概念上讲,这就是我要做的:

def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = {
    obj.update
}

我知道还有其他方法可以解决这个问题(例如,update()方法的结构化类型,公共基类等),但我的问题是在Scala中是否可以这样做,如果可以,语法是什么?

i1icjdpr

i1icjdpr1#

在Scala中,有一个类型Either来创建一个不相交的并集。基本上,你会做如下操作:

def doSomething(obj: Either[ObjectA, ObjectB]) {
  obj.fold(fa, fb)
}

checkout http://www.scala-lang.org/api/current/scala/Either.html

2wnc66cl

2wnc66cl2#

正如公认答案中提到的,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"))

相关问题