【发布时间】:2017-06-29 23:46:36
【问题描述】:
我有这门课
public abstract class Foo {
def execute: Unit = ???
}
public abstract class Bar {
def execute: Unit = ???
}
public class FooFoo extends Foo {
def execute: Unit = ???
}
public class BarBar extends Bar {
def execute: Unit = ???
}
在我有这种方法的地方:
def executeSomething(body: => AnyRef) : = Try(body) match ...
电话看起来像这样
x match {
case _: Foo => executeSomething(x.execute)
case _: Bar => executeSomething(x.execute)
}
有什么方法可以让我这样做(没有新课程)
val u = executeSomething(x)
?
更新
对不起,伙计们。这个 m.b.真实的代码会更清晰
import akka.actor.{Actor, ActorLogging, ActorRef, Props}
import com.google.api.client.auth.oauth2.AuthorizationCodeTokenRequest
import com.google.api.client.googleapis.json.GoogleJsonResponseException
import com.google.api.services.analytics.Analytics
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting
import com.my.lab.messages.{GRequest, GResponse}
import scala.util.{Failure, Success, Try}
class GQueueTask(req: GRequest, ref: ActorRef) extends Actor with ActorLogging {
def receive: Receive = {
case _ =>
}
def execute(body: => AnyRef): Unit = {
Try(body) match {
case Success(r) => ref ! GResponse(req, response = Option(r))
case Failure(f: GoogleJsonResponseException) =>
f.printStackTrace()
ref ! GResponse(req, error = Option(f))
case _ => ref ! GResponse(req, Option("unknown error"))
}
}
req match {
case GRequest(request, _) => request match {
case x: AnalyticsReporting#Reports#BatchGet => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Data#Ga#Get => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Accounts#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Webproperties#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Profiles#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: AuthorizationCodeTokenRequest => execute(x.execute()) // TokenRequest
case _ => ref ! GResponse(req)
}
}
context stop self
}
我试图简化“请求匹配”块
【问题讨论】:
-
为什么不扩展 Function 而只是调用
val u = x()?使用apply而不是execute。 -
我有一些遗留代码看起来像这样。我只能修改下面的executeSomething和代码:(
-
你不能只使用重载的executeSomething吗?
def executeSomething(x:Foo) = x.execute; def executeSomething(x:Bar) = x.execute? -
x是什么?Try(Body)的结果?您能否重新阅读您的问题并使其更清楚。
标签: scala types functional-programming