Generics 如何创建基于泛型类型返回对象的泛型Scala函数?
(Scala初学者问题) 我试图在斯卡拉编写一个程序,它对C++源文件进行了多次检查,我想实现可选的日志记录。 以下各项适用于一次检查:Generics 如何创建基于泛型类型返回对象的泛型Scala函数?,generics,scala,type-parameter,Generics,Scala,Type Parameter,(Scala初学者问题) 我试图在斯卡拉编写一个程序,它对C++源文件进行了多次检查,我想实现可选的日志记录。 以下各项适用于一次检查: val headerFiles = files.filter(_.matches(".*?\\.h$")) val headerGuardChecker = if(options.contains('verbose)) { new HeaderGuard with LoggingFileCheckerTrait } else { n
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"))
我在这两条新语句中发现编译错误,声称T不是类型。我相信这是由类型擦除引起的,但我还没有找到解决这个问题的方法。有没有一种方法可以完成我想做的事情?看看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 = ""
这里有一个很好的介绍,请记住,
T
不能保证有一个无参数构造函数;所以一个尝试
/捕获
可能是个好主意(或者使用反射来检查),谢谢,这似乎让我克服了这个问题。它仍然没有达到我预期的效果,但至少它编译并运行了。事实上,我仍然有一个问题。擦除正在失去特性,因此实例化[HeaderGuard with LoggingFileCheckerTrait]会给我与实例化[HeaderGuard]相同的结果,好的观点。我已经问了scala用户这个问题,希望我们能得到一个权威的答案。它在编译时看起来很好,但在运行时失败,这一事实令人不安!@JamesIry的副本您的解决方案没有显示如何使用TraitXYZ创建新的T。你是怎么做到的,还是可能的?