专业化发生的时间晚于专业化的ClassTag,因此谷仓门的问题就出现了.
另一个问题是专门化将创建双重定义,因此以明显的方式专门化方法并非易事.
这是尝试混合提供类标记的专用方法.
特殊的专用f
呼叫ct
,在特征中被覆盖.
我不知道虚拟arg ct
是必要的,以使其专业化; 也许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 "" [snip] 16: invokevirtual #32 // Method $line16/$read$$iw$$iw$$anon$1.f$mcI$sp:()[I 19: putfield #24 // Field res0:[I