在没有TypeTag的Scala中反映超类的值类型参数

莱奥米

在Java中,虽然在运行时删除了类型实参,但可以找到传递给超类的实际类型实参:

class Derived extends Base<String> {
  // ...
}

ParameterizedType type = (ParameterizedType)Derived.class.getGenericSuperclass();
Type[] args = type.getActualTypeArguments(); // gives {String.class}

虽然我可以对Scala类使用相同的Java反射,但它不能捕获Scala的值类型:

class Base[T]
class Derived extends Base[Int]

classOf[Derived]
  .getGenericSuperclass
  .asInstanceOf[ParameterizedType]
  .getActualTypeArguments // gives {Object.class}, not {int.class}

从泛型超类扩展时,是否可以确定使用的值类型?我正在从jar文件加载类,因此最好仅使用java.lang.Class实例来实现这一点

弗拉基米尔·马特维耶夫(Vladimir Matveev)

在Java反射中,您将无法获取Int和其他AnyVal类型,因为它们由编译器专门处理,并且如果它们被通用使用,它们将由表示Object但是,您可以使用Scala反射,并且完全有可能从Java反射变为Scala反射。这是如何做:

import scala.reflect.runtime.universe._

class Base[T]

class Derived extends Base[Int]

object Main extends App {
  val rm = runtimeMirror(getClass.getClassLoader)  // whatever class loader you're using

  val derivedSym = rm.staticClass(classOf[Derived].getName)
  val baseSym = rm.staticClass(classOf[Base[_]].getName)
  val TypeRef(_, _, params) = derivedSym.typeSignature.baseType(baseSym)
  println(s"$derivedSym extends $baseSym[${params.mkString(", ")}]")
}

不幸的是,除非您确切地知道要搜索的内容,否则将很难找到合适的文档。我在scala-users邮件列表中找到了答案Scala反射仍处于试验阶段,而且AFAIK可能会在以后的Scala版本中将其替换为更好的反射。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在没有TypeTag的Scala中反映超类的值类型参数

来自分类Dev

在Scala中访问类型参数的类级值

来自分类Dev

如何在 Scala 中没有早期初始化程序的情况下为超类构造函数创建参数

来自分类Dev

Scala:如何在超类中引用扩展类的类型?

来自分类Dev

使用 TypeTag 克服 Scala 中的类型擦除

来自分类Dev

超类'Bloc <xxx,xxx>'在dart中没有零参数构造函数

来自分类Dev

没有类型参数的模板父类

来自分类Dev

如何在Scala中反映与抽象类型的类型参数相对应的具体类型?

来自分类Dev

没有实例的Scala类值

来自分类Dev

使用Scala Type设置类型参数(通过TypeTag吗?)

来自分类Dev

Gson嵌套类参数没有值

来自分类Dev

Scala中类型参数的默认值

来自分类Dev

在Scala中,如何创建TypeTag [Map [A,B]],而只有TypeTag [A]和TypeTag [B]可用?

来自分类Dev

Scala中具有协变类型参数和私有构造函数的类

来自分类Dev

Scala:没有明确类型参数的类型转换

来自分类Dev

在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

来自分类Dev

访问超类子类中超类参数的受保护值

来自分类Dev

如何限制案例类在Scala中具有特定的参数类型构造函数?

来自分类Dev

没有类型参数的Scala中的运行时实例化

来自分类Dev

没有在ObservableSet forEach中丢失通配符的通用类参数类型

来自分类Dev

具有不同参数类型的Scala案例类

来自分类Dev

具有类型化参数的类上的Scala模式匹配

来自分类Dev

Scala宏注释-具有类型参数的案例类

来自分类Dev

Scala宏注释-具有类型参数的案例类

来自分类Dev

如何在scala中反映枚举类?

来自分类Dev

Scala擦除类类型参数

来自分类Dev

打字稿:如果派生类中没有传递值,如何设置可选参数?

来自分类Dev

使用超类作为泛型子类型中的类型参数

来自分类Dev

与Scala中的Existential类型一起使用时,通过TypeTag通过typeTag跟踪类型运行时类型

Related 相关文章

  1. 1

    在没有TypeTag的Scala中反映超类的值类型参数

  2. 2

    在Scala中访问类型参数的类级值

  3. 3

    如何在 Scala 中没有早期初始化程序的情况下为超类构造函数创建参数

  4. 4

    Scala:如何在超类中引用扩展类的类型?

  5. 5

    使用 TypeTag 克服 Scala 中的类型擦除

  6. 6

    超类'Bloc <xxx,xxx>'在dart中没有零参数构造函数

  7. 7

    没有类型参数的模板父类

  8. 8

    如何在Scala中反映与抽象类型的类型参数相对应的具体类型?

  9. 9

    没有实例的Scala类值

  10. 10

    使用Scala Type设置类型参数(通过TypeTag吗?)

  11. 11

    Gson嵌套类参数没有值

  12. 12

    Scala中类型参数的默认值

  13. 13

    在Scala中,如何创建TypeTag [Map [A,B]],而只有TypeTag [A]和TypeTag [B]可用?

  14. 14

    Scala中具有协变类型参数和私有构造函数的类

  15. 15

    Scala:没有明确类型参数的类型转换

  16. 16

    在Kotlin中覆盖超类的属性时,有没有办法声明更特定的泛型类型?

  17. 17

    访问超类子类中超类参数的受保护值

  18. 18

    如何限制案例类在Scala中具有特定的参数类型构造函数?

  19. 19

    没有类型参数的Scala中的运行时实例化

  20. 20

    没有在ObservableSet forEach中丢失通配符的通用类参数类型

  21. 21

    具有不同参数类型的Scala案例类

  22. 22

    具有类型化参数的类上的Scala模式匹配

  23. 23

    Scala宏注释-具有类型参数的案例类

  24. 24

    Scala宏注释-具有类型参数的案例类

  25. 25

    如何在scala中反映枚举类?

  26. 26

    Scala擦除类类型参数

  27. 27

    打字稿:如果派生类中没有传递值,如何设置可选参数?

  28. 28

    使用超类作为泛型子类型中的类型参数

  29. 29

    与Scala中的Existential类型一起使用时,通过TypeTag通过typeTag跟踪类型运行时类型

热门标签

归档