Scala中的抽象类型/类型参数

Scala中的抽象类型/类型参数,scala,types,Scala,Types,我正在尝试编写一些需要执行以下操作的Scala代码: class Test[Type] { def main { SomeFunc classOf[Type] val testVal: Type = new Type() } } 它正在失败。很明显,我对Scala泛型参数不太了解。显然,误解在于,C++中,模板本质上像字符串替换一样,因此,只要传入的类具有默认构造函数,新的类型()就可以工作。然而,在Scala中,类型是不同类型的对象 >你指出,C

我正在尝试编写一些需要执行以下操作的Scala代码:

class Test[Type] { 
   def main {
       SomeFunc classOf[Type]
       val testVal: Type = new Type()
    }
 }

它正在失败。很明显,我对Scala泛型参数不太了解。显然,误解在于,C++中,模板本质上像字符串替换一样,因此,只要传入的类具有默认构造函数,新的类型()就可以工作。然而,在Scala中,类型是不同类型的对象

>你指出,C++有模板。简而言之,C++表示“测试T编译的所有类型T都有一个测试”,这使得隐式地增加对T的约束很容易,但是在下边,它们是隐式的,对于类的用户来说,不读代码可能难以理解。
Scala的参数多态性(又称泛型)工作起来更像ML、Haskell、Java和C#。在Scala中,当您编写“类测试[T]”时,您说的是“对于所有的T,都存在一个类型测试[T]”,没有约束。从形式上讲,这更简单,但这确实意味着您必须明确约束。例如,在Scala中,您可以说“类测试[T]我如何使它工作?这两种方法中的任何一种都适用于T的基于参数的构造函数吗?
class Test[T](implicit val factory : () => T) {
  val testVal = factory
}
object Factories {
  implicit def listfact[X]() = List[X]()
  implicit def setfact[X]() = Set[X]()
  // etc
}

import Factories._
val t = new Test[Set[String]]
 class Test[T](implicit m : Manifest[T]) {
   val testVal = m.erasure.newInstance().asInstanceOf[T]
 }
class Foo
val t = new Test[Foo]
scala> new Test[Set[String]] 
java.lang.InstantiationException: scala.collection.immutable.Set
at java.lang.Class.newInstance0(Class.java:340)