我想定义一个函数来比较两个类的类型。我已经定义两个不同的类:Scala:比较类型
abstract class Task
case class DefinedTask(id: Long) extends Task
case class EmptyTask() extends Task
然后我有一个返回Task
类型的对象,这可能是要么DefinedTask
或EmptyTask
的功能。
现在,我想要做的是有标识,如果这个对象是DefinedTask
或只是一个EmptyTask
的功能。问题很简单,我会使用模式匹配。但我想推广它,因为多个类都采用这种Defined/Empty
模式。
我想到目前为止已经试过是:
def makeReturned[T: Manifest, U: Manifest](obj: T)(u: U)(f: T => Value) =
if(manifest[U] equals manifest[T]) f(obj) else
throw new IllegalArgumentException()
}
//call to it
makeReturned(task)(DefinedTask)(makeTask)
U
总是DefinedTask
,T
可能是要么DefinedTask or EmptyTask
,但它返回为Task
。
manifest[U].erasure.toString //"class DefinedTask$"
manifest[T].erasure.toString //"class Task"
这是从编译器的站立点的权利,但它并不适合我。所以,我的问题是我怎么能比较他们的方式,会给我我想要的?
我已经改写了一些代码,而不是返回EmptyTask,它抛出我在调用函数处理异常。这是一个很好的选择吗? – Andrew
做斯卡拉的推荐方法是一个功能性的方式,而在函数式编程抛出异常作为正常的程序流程的一部分,是一个没有没有。为了在功能上解决这类问题,Scala提供了'Option','Either'和'Try'类型。所以从这个角度来看,不,这不是一个好的选择。但是,如果您必须编写程序,则可以坚持遵循旧的Java约定。 –
我在做什么,实际上是一个网络应用程序。那我怎么知道失败的原因呢? – Andrew