gpt4 book ai didi

scala - 如何在 Scala 中获取泛型类型的运行时类?

转载 作者:行者123 更新时间:2023-12-02 03:03:21 26 4
gpt4 key购买 nike

import scala.reflect.runtime.universe._
import scala.reflect.ClassTag
import scala.reflect.classTag

def getTypeTag[T: TypeTag](obj: T) = println(typeTag[T].tpe)

class Entity
{
def greet = println("Hello!")
}

class Point[T : TypeTag](val x : T, val y :T) extends Entity

val p = new Point[Int](2,5)
val p2 = new Point[Float](1.0f,-5.0f)
val p3 = new Point[Double](4.0,-7.0)

val path = Array[Entity](p,p2,p3)

path.foreach(getTypeTag(_))

这个小代码片段写入标准输出

Helper.this.Entity
Helper.this.Entity
Helper.this.Entity

我想写

Helper.this.Point[Int]
Helper.this.Point[Float]
Helper.this.Point[Double]

我知道已经有很多关于 scala 反射的问题,我读了很多但仍然不明白 TypeTag、Manifest 和 ClassTag 之间的区别;我也无法使这个非常基本的示例起作用。任何帮助将不胜感激。

提前致谢

最佳答案

简短、合理的答案:

你不能。不要那样做。你为什么首先需要它?你可能做错了......

不满意的答案:

def printType(a: Any) =
a match {
case p: Point[_] =>
val clazz = p.getClass.getName
val tname = p.x.getClass.getName
println(s"$clazz[$tname]")
case _ =>
println("yolo")
}

class Entity

class Point[T](val x: T, val y: T) extends Entity

val p = new Point[Int](2,5)
val p2 = new Point[Float](1.0f,-5.0f)
val p3 = new Point[Double](4.0,-7.0)

val path = Array[Entity](p, p2, p3)

path.foreach(printType)

实际答案:

使用无形Typeable .

import shapeless._

val path = p :: p2 :: p3 :: HNil

object printType extends Poly1 {
implicit def case0[T](implicit t: Typeable[T]) =
at[T](_ => t.describe)
}

path.map(printType).toList.foreach(println)

关于scala - 如何在 Scala 中获取泛型类型的运行时类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44442494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com