如何在此示例中创建没有工厂的新对象?
)
我想有类似的东西
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但没有成功,我不想使用类型擦除
答案 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]
这是类型安全的,甚至可以有更复杂的实例化过程。