Возвращает экземпляр класса дела динамически с сопоставлением с образцом - PullRequest
0 голосов
/ 03 марта 2020

У меня есть разные классы дел и объекты для этого класса дел, и я пытаюсь создать экземпляр объекта класса и вернуть этот класс.

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
     }
   }

Здесь я получаю сообщение об ошибке в типе Return, каждый случай будет возвращаться по-разному кейс-класс. какой будет тип возвращаемого значения для этого метода?

1 Ответ

2 голосов
/ 03 марта 2020

В этом конкретном случае единственным общим предком между двумя классами case является AnyRef, следовательно, тип, который можно использовать как тип результата функции. Но использование AnyRef или Any является крайне не рекомендуемой практикой из-за безопасности потерянного типа.

Вместо этого вам нужно поставить точку, чтобы сформировать Sum Type, используя обычные sealed trait, как показано ниже:

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, и это будет безопасно.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...