Frage

Ich schreibe einen Java-Codegenerator.

Ich habe eine unveränderliche Karte, die eine Zuordnung von enthält java.sql.Types [Int] zu einem Tupel von (String, String) Dabei ist der erste Wert ein Java-Typ und der zweite ein Java-Paket, aus dem der Typ importiert werden soll, wenn er nicht standardmäßig importiert wird (java.lang):

val SqlTypesToJavaTypeNames =
    Map(Types.BIGINT -> ("Long", None),
        Types.BINARY -> ("byte[]", None),
        Types.BIT -> ("Boolean", None),
        Types.BOOLEAN -> ("Boolean", None),
        Types.CHAR -> ("String", None),
        Types.DATE -> ("Date", Some("java.sql.Date")),
        Types.DECIMAL -> ("BigDecimal", Some("java.math.BigDecimal")),
        Types.DOUBLE -> ("Double", None),
        Types.FLOAT -> ("Float", None),
        Types.INTEGER -> ("Integer", None),
        Types.LONGNVARCHAR -> ("String", None),
        Types.LONGVARCHAR -> ("String", None),
        Types.NCHAR -> ("String", None),
        Types.NUMERIC -> ("BigDecimal", None),
        Types.NVARCHAR -> ("String", None),
        Types.REAL -> ("Float", None),
        Types.SMALLINT -> ("Short", None),
        Types.SQLXML -> ("String", None),
        Types.TIME -> ("Time", Some("java.sql.Time")),
        Types.TIMESTAMP -> ("Timestamp", Some("java.sql.Timestamp")),
        Types.TINYINT -> ("Byte", None),
        Types.VARCHAR -> ("String", None))

Ich versuche, bei einer Suche auf dieser Karte eine Musterübereinstimmung zu finden dataType ist der java.sql.Types Wert aus Datenbankmetadaten:

val (javaType, importType) =
  SqlTypesToJavaTypeNames.get(dataType) match {
    case Some(jType, Some(iType)) => (jType, iType)
    case Some(jType, None) => (jType, null)
    case None => throw new IllegalStateException("Unknown translation to Java type for SQL type " + dataType)
  }

Der Compiler gibt mir beim ersten Mal eine Fehlermeldung case (beginnt mit case Some(jType, Some(iType))): error: wrong number of arguments for <none>: (x: (java.lang.String, Option[java.lang.String]))Some[(java.lang.String, Option[java.lang.String])]

Ich bin mir nicht sicher, was falsch ist.

War es hilfreich?

Lösung

Some extrahiert nicht auf zwei Werte, sondern auf einen.Wenn Sie ein Paar finden möchten, müssen Sie die Klammern verdoppeln:

case Some( (jType, Some(iType)) ) => (jType, iType)

Es wäre schön, wenn Sie die Pfeilkonvention als Extraktor verwenden könnten, aber das scheint leider nicht zu funktionieren:

case Some(jType -> Some(iType)) => (jType, iType)

AKTUALISIEREN

Alternativ könnten Sie, sofern Sie eine Option verwenden, deren monadische Natur ausnutzen und das Ding einfach zuordnen:

val tpes = SqlTypesToJavaTypeNames.get(dataType)
val (javaType, importType) =
  tpes map { case (a,b) => (a, b.orNull) } getOrElse { throw ... }

Andere Tipps

Ihnen fehlen die inneren Klammern (weil Sie eine haben). Option[(A, B)]:

case Some( (jType, Some(iType)) ) => 
case Some( (jType, _) )           =>
case None                         =>

So wie Ihre Methode aussieht, scheint es, als könnten Sie sie noch weiter vereinfachen:

SqlTypesToJavaTypeNames.get(dataType) map { case (jType, maybeIType) => jType -> maybeIType.orNull } getOrElse error("Unmapped : " + dataType)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top