如何设置一个变量的基于通用类型的值 - 斯卡拉

问题描述:

我试图做这样的事情: -如何设置一个变量的基于通用类型的值 - 斯卡拉

Trait Hello[A] 
{ 
    val DBAccessDAO =  A match 
        { case classname: Class1 => Class1DAO 
         case classname: Class2 => Class2DAO 
        } 
.... 

//(use appropriate DBAccessDAO to perform DAO operations 

} 

如何在斯卡拉做到这一点?我不确定如何访问“A”并安全地检查其类型。

感谢

下面是一个简单的例子,使得使用TypeTag在编译时

import scala.reflect.runtime.universe.{TypeTag,typeOf} 


trait Animal26 
{ 
    val name: String 
    val sound: String 
} 


object Tiger26 extends Animal26{ 

    override val name = "tiger" 
    override val sound = "grrr" 
} 


trait Person26 
{ 
    val title: String 
    val status: String 
} 


object Employee26 extends Person26{ 

    val title = "worker" 
    val status = "professional" 

} 


class Stack[A: TypeTag] { 

    def getMyClass = 
    { 
    if (typeOf[A] =:= typeOf[Person26]) 
    Employee26 
    else 
    Tiger26 
    } 


} 

object App26 extends App{ 

    val stack = new Stack[Person26] 

    println(stack.getMyClass.toString) 

} 

来查找类信息由于类型擦除,你不能访问的T直接类型如你所愿。编译器为您的所有类生成一个ClassTag类型,因此您可以绕过类型擦除限制。您可以访问ClassTag含蓄:

import scala.reflect.runtime.universe._ 

class Hello[A : TypeTag] { 
    val DBAccessDAO = typeTag[A] match { 
     case tag if tag == typeTag[Class1] => ... 
     case tag if tag == typeTag[Class2] => ... 
    } 
} 
+0

还要注意,应该使用'TypeTag'而不是'ClassTag'来区分,例如'List [Class1]'和'List [Class2]'。 –

+0

不能做到这一点与性状 – Dima

+0

真的很好的观察。特征不接受上下文绑定类型参数。我改变了使用Class的答案 – Miguel

您可以使用TypeTag或东西从Shapless库,但你具体案件我会建议寻找到型类模式。使用反射技巧获取类型参数几乎总是不是最好的解决方案。