【问题标题】:Get type class from generic in scala从scala中的泛型获取类型类
【发布时间】:2014-12-26 21:11:41
【问题描述】:

我想从 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$

【问题讨论】:

  • 这两个Ts 是不同的。试试:例如Car.something[String]()
  • @GáborBakos 啊..哈!谢谢!!

标签: scala generics


【解决方案1】:

您可能需要以下内容: 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) 如果您将语法修复为def something[U](implicit ev: T =:= U, tag: ClassTag[U]),则比要求的更复杂。
【解决方案2】:
class Model[T:ClassTag] {

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

}

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多