(斯卡拉初学者问题)
我正在尝试在Scala中编写一个对C ++源文件进行大量检查的程序,我想实现可选的检查记录。
以下一项检查工作正常:
val headerFiles = files.filter(_.matches(".*?\\.h$"))
val headerGuardChecker = if(options.contains('verbose)) {
new HeaderGuard with LoggingFileCheckerTrait
} else {
new HeaderGuard
}
headerFiles.foreach(h => if (! headerGuardChecker.check(new File(h))) println(h + " doesn't have a header guard"))
然而,当我尝试使用泛型来概括它时:
def checker[T] = if(options.contains('verbose)) {
new T with LoggingFileCheckerTrait
} else {
new T
}
val headerFiles = files.filter(_.matches(".*?\\.h$"))
headerFiles.foreach(h => if (! checker[HeaderGuard].check(new File(h))) println(h + " doesn't have a header guard"))
我在两个 new 语句中遇到编译错误,声称T不是一个类型。我相信这是由类型擦除引起的,但我还没有找到一种解决方法。有办法做我想做的事吗?
答案 0 :(得分:7)
看看Scala“清单”。它们通常允许您绕过JVM上的类型擦除。
scala> def instantiate[T](implicit m:Manifest[T]) = m.erasure.newInstance().asInstanceOf[T]
instantiate: [T](implicit m: Manifest[T])T
scala> instantiate[String]
res0: String = ""
的简介