如何设置一个变量的基于通用类型的值 - 斯卡拉
问题描述:
我试图做这样的事情: -如何设置一个变量的基于通用类型的值 - 斯卡拉
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] => ...
}
}
答
您可以使用TypeTag或东西从Shapless库,但你具体案件我会建议寻找到型类模式。使用反射技巧获取类型参数几乎总是不是最好的解决方案。
还要注意,应该使用'TypeTag'而不是'ClassTag'来区分,例如'List [Class1]'和'List [Class2]'。 –
不能做到这一点与性状 – Dima
真的很好的观察。特征不接受上下文绑定类型参数。我改变了使用Class的答案 – Miguel