我想从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$
答案 0 :(得分:2)
您可能需要以下内容:
T=:=U
将unify 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 = ...
}
显然这适用于例如Numeric
,Ordering
等约束。