我一直在玩一个宠物项目,该项目旨在根据案例类中的字段生成一个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}}
这是因为我这样做的方式是错误的(如果有的话,这是正确的方式?)还是因为其他我没有看到的东西?
答案 0 :(得分:0)
在敲了敲我的脑袋之后,似乎我找到了一个我应该在很久以前见过的解决方案,因为帮助器类是abstract class
,这意味着调用getClass
会返回扩展类的类。 / p>
TL; DR
我所要做的就是用classOf[T]
替换this.getClass
。类型标记T
保留在原样位置,因为它用于另一种方法
这是我正在处理https://gist.github.com/LiamHaworth/6fda3836227b8ecd2206
的完整版本