Scala 使用模式匹配动态返回案例类的实例

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类,我有不同的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 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
,这两个类都属于该类型并返回该类型。这种松散的打字很危险