2013-06-14 2 views
1

Я новичок в способности отражения Scala. Мне было интересно, можно ли построить фабричный объект, который поставляет экземпляры разных классов в соответствии с параметром типа.Использование API отражения Scala для динамического создания экземпляра фабричного класса

Код ниже не работает, но он описывает в минимальном примере то, чего я пытаюсь достичь. Я оставил код для A1Factory и A2Factory, потому что здесь они не имеют значения.

sealed abstract class A 

class A1 extends A 

class A2 extends A 

object Factory { 
    def apply[T <: A]() = { 
    classOf[T] match { 
     case x: A1 => new A1Factory() 
     case x: A2 => new A2Factory() 
    } 
    } 
} 

То, что я хочу, чтобы иметь возможность сделать что-то вроде этого:

type currentType = A1 
val factory = Factory[currentType]() 

И фабрика типа A1Factory.

Можно ли это сделать?

ответ

1

Возможно, рассказав компилятор сохранить типы во время выполнения с помощью неявного ClassTag:

object Factory { 
    def apply[T <: A]()(implicit tag: ClassTag[T]) = { 
    val A1 = classOf[A1] 
    val A2 = classOf[A2] 
    classTag[T].runtimeClass match { 
     case A1 => new A1Factory() 
     case A2 => new A2Factory() 
    } 
} 
+1

Вы можете рассмотреть вопрос о 'TypeTags', чтобы избежать стирания параметров' Т *. – gzm0

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

  • Нет связанных вопросов^_^