gpt4 book ai didi

scala - 使用 classManifest 提供具有上限的 Class 对象

转载 作者:行者123 更新时间:2023-12-04 05:40:13 24 4
gpt4 key购买 nike

假设我需要提供一个带有 java.lang.Class 的方法表示某个父类的子类的对象 A .我需要从另一个方法执行此操作,该方法具有一个上限类型绑定(bind)到 A 的泛型参数.

我认为这可能有效:

class A
def f(clazz: java.lang.Class[_ <: A]) = ()
def g[T <: A : Manifest] = f(classManifest[T].erasure)

但它没有:
<console>:9: error: type mismatch;
found : java.lang.Class[_$1(in method g)] where type _$1(in method g)
required: java.lang.Class[_ <: A]
def g[T <: A : Manifest] = f(classManifest[T].erasure)
^

为什么编译器无法判断 T确实是 A 的子类?无论如何我可以帮助它吗?或者我应该以完全不同的方式处理这个问题?

最佳答案

它不起作用,因为 erasure has the type Class[_] ,这是一种存在类型。这意味着 Class对象 erasure由某种类型参数化,但确切的类型并不重要。 erasure没有类型 Class[T]多于。

方法f需要 Class[_ <: A] 类型的参数这是某种已知是 A 子类型的类型. Class[_] 不一定保证这个上限。在上面输入。

解决方案 : 你知​​道erasure有一个合适的类型,只是这个类型没有暴露在 ClassManifest目的。简单地转换它:

classManifest[T].erasure.asInstanceOf[Class[A]]

编辑:

如果你有一个子类 BA :
scala> class A

scala> def f(clazz: java.lang.Class[_ <: A]) = ()

scala> def g[T <: A : Manifest] = f(classManifest[T].erasure.asInstanceOf[Class[A]])

scala> g[A]

scala> class B extends A

scala> g[B]

关于scala - 使用 classManifest 提供具有上限的 Class 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11354427/

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