2016-02-11 6 views
0

Как создать новый объект без фабрики в этом примере?Построение нового объекта общего типа

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 без какого-либо успеха, и я не хочу использовать тип стиранию

ответ

1

Ну, вы можете создать пример с использованием тега класса:

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

Вы также можете получить другие конструкторы и invok e если класс не имеет конструктора по умолчанию. Тем не менее, нет способа сделать это действительно типом сохранения, а вместо фабрик типов вам придется передавать теги классов. Поэтому я думаю, что завод предпочтительнее. Однако вы можете использовать неявный завод, который может сделать вещи проще:

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

Это типизированное, и вы даже можете иметь гораздо более сложную процедуру при создании экземпляра.

Смежные вопросы