Scala 使用模式匹配动态返回案例类的实例
对于这个case类,我有不同的case类和对象,我试图实例化class对象并返回那个类Scala 使用模式匹配动态返回案例类的实例,scala,Scala,对于这个case类,我有不同的case类和对象,我试图实例化class对象并返回那个类 case class KeySet(KeyID:String,KeyName:String,KeyType:String) object KeySet{ def fromXml(node: scala.xml.Node):KeySet = { //some operation new KeySet(KeyID,KeyName,KeyType) } } case class NodeS
case class KeySet(KeyID:String,KeyName:String,KeyType:String)
object KeySet{
def fromXml(node: scala.xml.Node):KeySet = {
//some operation
new KeySet(KeyID,KeyName,KeyType)
}
}
case class NodeSet(NodeID:String,NodeValue:String,NodeType:String,NodeKey:String,NodeLocation:String)
object NodeSet{
def fromXml(node: scala.xml.Node):NodeSet = {
//some operation
new KeySet(NodeID,NodeValue,NodeType,NodeKey,NodeLocation)
}
}
我有一个方法来创建类的实例并返回类对象
def getConnectionDetails(connectionType:String) : Option[Class[_]]= {
connectionType match {
case "KeySet" => Some(() => {
val xml_cred= scala.xml.XML.loadString("xmlfile")
KeySet.fromXml(xml_cred)
})
case "NodeSet" => Some(() => {
val xml_cred= scala.xml.XML.loadString("xmlfile")
NodeSet.fromXml(xml_cred)
})
case _ => None
}
}
这里我得到了返回类型中的错误,每个案例将返回不同的案例类。
此方法的返回类型是什么 在这种特殊情况下,两个case类之间唯一的共同祖先是
AnyRef
,因此该类型可用作函数结果类型。但是,由于丢失类型的安全性,使用AnyRef
或Any
是强烈不推荐的做法
相反,您需要点的是通过使用公共密封特征
,形成和类型
,如下所示:
sealed trait ConnectionDetails
case class KeySet(keyID: String, keyName: String, keyType: String) extends ConnectionDetails
case class NodeSet(nodeID: String, nodeValue: String, nodeType: String, nodeKey: String, nodeLocation: String) extends ConnectionDetails
def getConnectionDetails(connectionType:String) : Option[ConnectionDetails]= {
connectionType match {
case "KeySet" =>
val xml_cred= scala.xml.XML.loadString("xmlfile")
Some(KeySet.fromXml(xml_cred))
case "NodeSet" =>
val xml_cred= scala.xml.XML.loadString("xmlfile")
Some(NodeSet.fromXml(xml_cred))
case _ => None
}
}
因此,在所有其他地方,您可以对ConnectionDetails
进行模式匹配,这将是安全的
希望这有帮助 在这种特殊情况下,两个case类之间唯一的共同祖先是
AnyRef
,因此该类型可用作函数结果类型。但是,由于丢失类型的安全性,使用AnyRef
或Any
是强烈不推荐的做法
相反,您需要点的是通过使用公共密封特征
,形成和类型
,如下所示:
sealed trait ConnectionDetails
case class KeySet(keyID: String, keyName: String, keyType: String) extends ConnectionDetails
case class NodeSet(nodeID: String, nodeValue: String, nodeType: String, nodeKey: String, nodeLocation: String) extends ConnectionDetails
def getConnectionDetails(connectionType:String) : Option[ConnectionDetails]= {
connectionType match {
case "KeySet" =>
val xml_cred= scala.xml.XML.loadString("xmlfile")
Some(KeySet.fromXml(xml_cred))
case "NodeSet" =>
val xml_cred= scala.xml.XML.loadString("xmlfile")
Some(NodeSet.fromXml(xml_cred))
case _ => None
}
}
因此,在所有其他地方,您可以对ConnectionDetails
进行模式匹配,这将是安全的
希望这有帮助 在上面的代码中,在这两种情况下,您都在构造一个
键集
,包括在第二种情况下。那不可能。你在找选项[AnyRef]
Class[\u]
是一个表示类型的类型,而不是一个表示任何类的类型。一般来说,您应该有一个父类trait
,这两个类都属于该类型并返回该类型。在上面的代码中,这种松散的键入是危险的,在这两种情况下,您都在构造一个键集,包括在第二种情况下。那不可能。你在找选项[AnyRef]
Class[\u]
是一个表示类型的类型,而不是一个表示任何类的类型。一般来说,您应该有一个父类trait
,这两个类都属于该类型并返回该类型。这种松散的打字很危险