从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])
,则会比需要的更复杂。