gpt4 book ai didi

scala - 从专业类中获取 ClassTag

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

当我有一个@specialized 类时,我会保留有关我的类型是什么原语的信息。有没有一种快速的方法来获取ClassTag[T],例如创建数组?

这不会编译,因为没有可用的 ClassTag[T]

class Foo[@specialized T] {
def bar: Array[T] = new Array[T]
}

这可行,但我想避免传递 ClassTag

class Foo[@specialized T: ClassTag] {
def bar: Array[T] = new Array[T]
}

这有效,但是很慢:

class Foo[@specialized T] {
def bar: Array[T] = new Array[T]

implicit def classTag: ClassTag[T] = {
val name = getClass.getName
if(name.endsWith("$I$sp") ClassTag.Int
else if(name.endsWith("$L$sp") ClassTag.Long
else ??? // you get the idea
}
}

最佳答案

特化发生在 typer 的 ClassTags 的具体化之后,所以有谷仓门的问题。

另一个问题是专门化会创建双重定义,因此以明显的方式手动专门化方法并非易事。

这里尝试混入提供类标签的专用方法。

专用 f 调用专用 ct,它在特征中被覆盖。

我不知道 ct 的虚拟 arg 是使其特化所必需的;也许 ClassTag[A] 结果类型不够。

$ scalam
Welcome to Scala 2.12.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions for evaluation. Or try :help.

scala> import reflect.ClassTag
import reflect.ClassTag

scala> class CT[@specialized(Int) A] {
| def ct(a: A): ClassTag[A] = ???
| def f: Array[A] = ct(null.asInstanceOf[A]).newArray(1)
| }
defined class CT

scala> trait CTS { def ct$mcI$sp(i: Int): ClassTag[Int] = reflect.classTag[Int] }
defined trait CTS

scala> (new CT[Int] with CTS).f
res0: Array[Int] = Array(0)

显示专门的调用:

scala> :javap -c -
Compiled from "<console>"
[snip]
16: invokevirtual #32 // Method $line16/$read$$iw$$iw$$anon$1.f$mcI$sp:()[I
19: putfield #24 // Field res0:[I

关于scala - 从专业类中获取 ClassTag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34276512/

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