gpt4 book ai didi

scala - 如何在 Scala 中创建类型对象的集合

转载 作者:行者123 更新时间:2023-12-04 06:12:25 27 4
gpt4 key购买 nike

基本上,我想要一个按类型对象索引的 Map。在这种情况下,我尝试使用 Class 作为“类型类型”。

以下代码:

class SuperClass {}
val typemap = new HashMap[Class[_ <: SuperClass], SuperClass]

def insertItem1[T <: SuperClass] (item : T) = typemap += classOf[T] -> item
def insertItem2[T <: SuperClass] (item : T) = typemap += item.getClass -> item

不编译,因为 (1) classOf[T] 显然无效:
error: class type required but T found

和 (2) item.getClass 是错误的类型:
Type mismatch, expected: Class[_ <: SuperClass], actual: Class[_]

我看到有两种方法可以实现这一点:
要么删除类型要求并仅使用 Class[_]
或使用 Manifest 而不是 Class (不确定如何做,欢迎提供任何示例)

但更一般地说,为什么 classOf[T] 无效,以及如何获取参数化类型的类对象?

更新:我发现我可以使用 item.getClass.asInstanceOf[Class[T]]到达类对象。一方面,这很丑陋。对于两个,它没有多大帮助,因为在代码的后面我有这样的函数:
def isPresent[T <: SuperClass] = typemap contains classOf[T]

显然,我可以在 insertItem 中使用 asInstanceOf 方法。并将类作为参数传递给 isPresent .有没有更好的办法?

最佳答案

您可以使用 list 来实现这一点:

class TypeMap extends HashMap[Class[_], Any] {
def putThing[T](t: T)(implicit m: Manifest[T]) = put(m.erasure, t)
}

val map = new TypeMap
map.putThing(4)
map.get(classOf[Int]) // returns Option[Any] = Some(4)

您正在通过删除丢失类型,因此您需要使用 Manifest 将隐式参数添加到包含类名称的 putThing 中。

关于scala - 如何在 Scala 中创建类型对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7629861/

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