Scala类型标记无法按预期工作

时间:2015-07-15 02:56:52

标签: scala

我一直在玩一个宠物项目,该项目旨在根据案例类中的字段生成一个SQL表,这是通过扩展帮助程序类以公开所需功能的方法的case类来完成的。

大部分内容都与班级类型不同,现在请注意,这是我第一次处理这类事情,所以这可能是最糟糕的做法。

这是辅助类(CrateObject.scala

abstract class CrateObject[T] {

  def create(schema: String)(implicit crateClient: CrateClient): Boolean = {
    if(crateClient == null)
      throw new IOException("Requires implicit object crateClient to be initialized")

    if(exists(schema)(crateClient))
      return false

    val tableName = classOf[T].getSimpleName.toLowerCase
    var tableColumns = Map.empty[String, String]

    classOf[T].getDeclaredFields.foreach { f =>
      f.getType match {
        case t if t == classOf[String]      => tableColumns += f.getName -> "string"
        case t if t == classOf[Int]         => tableColumns += f.getName -> "integer"
        case t if t == classOf[Integer]     => tableColumns += f.getName -> "integer"
        case t if t == classOf[Boolean]     => tableColumns += f.getName -> "boolean"
        case t if t == classOf[Short]       => tableColumns += f.getName -> "short"
        case t if t == classOf[Double]      => tableColumns += f.getName -> "double"
        case t if t == classOf[Array]       => tableColumns += f.getName -> "array"
      }
    }

    val sqlStatement = s"create table $schema.$tableName (${tableColumns.mkString(", ").replace(" ->", "")})"

    try {
      crateClient.sql(sqlStatement)
      true
    }
    catch {
      case ex: Exception =>
        throw new IOException(s"Failed to make table for $schema.$tableName", ex)
    }
  }
}

我遇到的问题是classOf[T] class type required but T found失败了<{1}}

这是因为我这样做的方式是错误的(如果有的话,这是正确的方式?)还是因为其他我没有看到的东西?

1 个答案:

答案 0 :(得分:0)

在敲了敲我的脑袋之后,似乎我找到了一个我应该在很久以前见过的解决方案,因为帮助器类是abstract class,这意味着调用getClass会返回扩展类的类。 / p>

TL; DR

我所要做的就是用classOf[T]替换this.getClass。类型标记T保留在原样位置,因为它用于另一种方法

这是我正在处理https://gist.github.com/LiamHaworth/6fda3836227b8ecd2206

的完整版本