簡體   English   中英

在Scala 2.10中使用ClassTag / TypeTag代替ClassManifest

[英]Using ClassTag/TypeTag instead of ClassManifest in 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復制功能?

編輯:正如丹尼爾指出,這有效:

    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
    }

如果您有一個Class ,則應該只使用isAssignableFrom

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

我不確定為什么它必須這么復雜...當然,如果您已經有一個Class實例,您可以直接調用Class.newInstance 像這樣:

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

或者也許您正在執行匹配,因為在您的真實代碼中,每個類都有一個單獨的(默認)參數列表,以傳遞給構造函數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM