2013-02-21 3 views
2

У меня есть некоторый код, чтобы создать экземпляр класса случайный, как это:Использование ClassTag/TypeTag вместо ClassManifest в Scala 2.10

trait T 
class A extends T 
class B extends T 
class C extends T 

def createRandomT = { 
    val choices = Vector(classOf[A], classOf[B], classOf[C]) 
    val cls = new scala.util.Random().shuffle(choices).head 
    instantiateT(cls) 
}         

def instantiateT(cls: Class[_ <: T]) = { 
    ClassManifest.fromClass(cls) match { 
     case c if c <:< classManifest[A] => new A 
     case c if c <:< classManifest[B] => new B 
     case c if c <:< classManifest[C] => new C 
    } 
} 

Это работает, но после обновления до 2.10 instantiateT дает различные предупреждения устаревания.

Любые подсказки о том, как реплицировать функциональность ClassTag и/или TypeTag?

Edit: Как отметил Даниил это работает:

cls match { 
     case c if c.isAssignableFrom(classOf[A]) => new A 
     case c if c.isAssignableFrom(classOf[B]) => new B 
     case c if c.isAssignableFrom(classOf[C]) => new C 
    } 

ответ

2

Если у Вас есть Class, вы должны просто использовать isAssignableFrom.

case c if cls.isAssignableFrom(c.getClass()) => new A 
+0

Doh, конечно. Благодаря! – hezamu

2

Я не знаю, почему это должно быть так сложно ... Конечно, если у вас уже есть Class экземпляр вы можете просто позвонить Class.newInstance? Как так:

def instantiateT(cls: Class[_ <: T]) = cls.newInstance 

Или, может быть, вы проводите матч, потому что в вашем реальном коде каждый класс имеет отдельный список (по умолчанию) аргумента передать в конструктор?

+0

Да, вы правы, реальный код несколько больше связан с конструированием экземпляров. – hezamu