构造泛型类型的新对象

时间:2016-02-11 00:03:47

标签: scala generics

如何在此示例中创建没有工厂的新对象?

)

我想有类似的东西

def checkErrors[TResult, TError, TException <: Throwable](
  result: Either[TError, TResult],
  exceptionFactory: TError => TException): TResult = {
result.fold(
  err => throw exceptionFactory(err),
  ok => ok
)}

checkErrors(Foo.run(), (err: ErrorResponse) => new My CustomException(err.toString))

我尝试使用ClassTag但没有成功,我不想使用类型擦除

1 个答案:

答案 0 :(得分:1)

好吧,您可以使用类似这样的类标记创建实例:

 def foo[T: ClassTag]: T = implicitly[ClassTag[T]].runtimeClass.newInstance.asInstanceOf[T]

如果类没有默认构造函数,您还可以获取其他构造函数并调用它们。然而,没有办法使这个真正的类型保存,而不是类型工厂,你将不得不传递类标签。所以我认为工厂更可取。但是,您可以使用隐式工厂,这可能会使事情变得更容易:

case class Instanciable[T](create: () => T)
implicit val stringInstanciable = new Instanciable(() => "hello")
def foo[T: Instanciable] = implicitly[Instanciable[T]].create()
foo[String]

这是类型安全的,甚至可以有更复杂的实例化过程。