문제

Java 코드 생성기를 작성하고 있습니다.

INT] java.sql.Types [int]에서 첫 번째 값이 기본적으로 가져 오지 않으면 유형을 가져올 수있는 Java 패키지의 튜플에 (String, String) [int]에서 매핑 할 수없는 맵이 있습니다.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))
.

이 맵을 검색하는 데 패턴 일치를 시도하고 있으며, dataType는 데이터베이스 메타 데이터의 java.sql.Types 값입니다.

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

컴파일러는 첫 번째 case (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])]

나는 무엇이 잘못되었는지 확신하지 못한다.

도움이 되었습니까?

해결책

Some는 두 값으로 추출되지 않고 하나로 추출합니다.쌍을 일치시키고 싶다면 괄호를 두 번 위로해야합니다.

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

화살표 규칙을 추출기로 사용할 수 있지만 슬프게도 작동하지 않는 것처럼 보이는 경우는 좋을 것입니다.

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

업데이트

옵션을 사용하고 있음을 감안할 때 모나다이드 성격을 활용할 수 있으며 단순히 단순히 맵핑 할 수 있습니다 :

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

다른 팁

내부 기부금이 없습니다 (Option[(A, B)]가 있기 때문에 :

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

귀하의 방법의 외관에서 더 많은 것을 단순화 할 수있는 것처럼 보입니다.

SqlTypesToJavaTypeNames.get(dataType) map { case (jType, maybeIType) => jType -> maybeIType.orNull } getOrElse error("Unmapped : " + dataType)
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top