Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何创建基于泛型类型返回对象的泛型Scala函数?_Generics_Scala_Type Parameter - Fatal编程技术网

Generics 如何创建基于泛型类型返回对象的泛型Scala函数?

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

(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"))
我在这两条新语句中发现编译错误,声称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。你是怎么做到的,还是可能的?