在scala中从泛型中获取类型类

时间:2014-12-26 21:11:41

标签: scala generics

我想从Generic类型中获取实际的类型。

当我尝试这个时

我只获得课程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$

3 个答案:

答案 0 :(得分:2)

您可能需要以下内容: T=:=Uunify the two types:ClassTag只会为其创建ClassTag

编辑:正确但仍然过于复杂的形式:

trait Model[T] {
  def something[U](implicit ev: T =:= U, tag: ClassTag[U]): Unit = {
    println(tag.runtimeClass)
  }

一般来说,我也会使用https://stackoverflow.com/a/27666845/1502148(当我不困时:)。

答案 1 :(得分:2)

class Model[T:ClassTag] {

  def something():Unit = {
    println(classTag[T].runtimeClass)
  }

}

我通过将Model trait修改为class并将ClassTag提供给Generic来解决。

答案 2 :(得分:1)

如果您想允许在没有Model的情况下创建ClassTag,并且某些方法只需要ClassTag,则可以

trait Model[T] {
  def something(implicit tag: ClassTag[T]):Unit = ...
}

显然这适用于例如NumericOrdering等约束。