【问题标题】:Constructing the new object of a generic type构造泛型类型的新对象
【发布时间】:2016-02-11 08:59:16
【问题描述】:

在本例中如何在没有工厂的情况下创建新对象?

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))

我想要这样的东西

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

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

【问题讨论】:

    标签: scala generics


    【解决方案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]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2018-07-09
      • 2017-03-12
      相关资源
      最近更新 更多