从scala中的泛型获取类型类
我想从泛型类型中获取实际的类型类 当我尝试这个的时候 我得到了类从scala中的泛型获取类型类,scala,generics,Scala,Generics,我想从泛型类型中获取实际的类型类 当我尝试这个的时候 我得到了类scala.runtime.Nothing import scala.reflect._ class Car { } object Car extends Model[Car] { } trait Model[T] { def something[T:ClassTag]():Unit = { println(classTag[T].runtimeClass) } } Car.something() /
scala.runtime.Nothing
import scala.reflect._
class Car {
}
object Car extends Model[Car] {
}
trait Model[T] {
def something[T:ClassTag]():Unit = {
println(classTag[T].runtimeClass)
}
}
Car.something() // <- scala.runtime.Nothing$
导入scala.reflect_
班车{
}
对象汽车模型[汽车]{
}
特征模型[T]{
定义某物[T:ClassTag]():单位={
println(classTag[T].runtimeClass)
}
}
Car.something()//您可能需要以下内容:
T=:=U
将为它创建一个ClassTag
编辑:正确但过于复杂的表单:
trait Model[T] {
def something[U](implicit ev: T =:= U, tag: ClassTag[U]): Unit = {
println(tag.runtimeClass)
}
一般来说,我也会使用(当我不困时:)。您可能需要以下内容:
T=:=U
将为它创建一个ClassTag
编辑:正确但过于复杂的表单:
trait Model[T] {
def something[U](implicit ev: T =:= U, tag: ClassTag[U]): Unit = {
println(tag.runtimeClass)
}
一般来说,我也会使用(当我不困的时候:))
我通过将模型trait修改为class并将ClassTag提供给Generic来解决这个问题
我通过将Model trait修改为class并将ClassTag提供给Generic解决了这个问题。如果您想允许在不使用ClassTag的情况下创建模型
,并且对于某些方法只需要ClassTag
,您可以这样做
trait Model[T] {
def something(implicit tag: ClassTag[T]):Unit = ...
}
显然,这也适用于例如Numeric
,Ordering
等约束。如果您想允许在不使用ClassTag
的情况下创建模型
,并且对于某些方法只需要ClassTag
,您可以这样做
trait Model[T] {
def something(implicit tag: ClassTag[T]):Unit = ...
}
显然,这也适用于例如数值
,排序
等约束。这两个T
是不同的。试试:Car.something[String]()
例如。@GáborBakos啊。。哈谢谢这两个T
s是不同的。试试:Car.something[String]()
例如。@GáborBakos啊。。哈谢谢这是1)不合法的语法;2) 如果您将语法修改为def something[U](隐式ev:T=:=U,tag:ClassTag[U])
,则会比需要的更复杂。这是1)不是合法语法;2) 如果将语法修改为def something[U](隐式ev:T=:=U,tag:ClassTag[U])
,则会比需要的更复杂。