2013-02-21 65 views
2

使用ClassTag/TypeTag代替ClassManifest我有一些代碼實例化一個Random類是這樣的:在斯卡拉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複製功能?

編輯:正如指出的丹尼爾這個工程:

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 2013-02-21 15:16:24

2

我不知道爲什麼它有這麼複雜...... 當然,如果你已經有了一個Class例如,你可以叫Class.newInstance?像這樣:

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

或者,也許你是因爲你的真實代碼進行匹配每個類都有(默認)參數的單獨列表傳遞給構造?

+0

是的,你是對的,真正的代碼更多地涉及構造實例。 – hezamu 2013-02-21 15:18:55