gpt4 book ai didi

scala - 与 Scala 通用。没有可用于 T 的 ClassTag

转载 作者:行者123 更新时间:2023-12-01 11:16:58 26 4
gpt4 key购买 nike

我尝试在 Scala 中使用泛型,但在某些情况下它对我不起作用。

我定义了一个类:

trait Generic[T <: Product] extends Serializable {

def start(ssc: StreamingContext, conf: Conf) = {
val dstream = createDirectStream(...)
val rdd = dstream.map(x => avroToObject(x.value()))
execute(rdd)
}

def execute(dstreamAvro: DStream[T]): Unit
def avroToObject(bytes: Array[Byte]): T
}

后来,我在具体的类中实现了avroToObject方法。当我尝试编译代码时出现错误。

Error:(36, 30) No ClassTag available for T
val rddAvro = dstream.map(x => avroToObject(x.value()))
Error:(36, 30) not enough arguments for method map: (implicit evidence$2: scala.reflect.ClassTag[T])org.apache.spark.streaming.dstream.DStream[T].
Unspecified value parameter evidence$2.
val rddAvro = dstream.map(x => avroToObject(x.value()))

这是怎么回事?我该如何解决?

如果我通过以下方式更改类的声明:

abstract class Generic[T <: Product](implicit c: ClassTag[T]) extends Serializable {..

它有效,但我不明白为什么,以及为什么它需要隐式。

最佳答案

What is it happening? How could I fix it?

正在发生的事情是,执行链中的一种方法需要存在 ClassTag[T] 的实例。虽然我们这里没有实现,但我假设这是 KafkaUtils.createDirectStream 方法,它在运行时需要 T 类型的信息。

这个有效:

abstract class Generic[T <: Product](implicit c: ClassTag[T])

因为现在当您调用 createDirectStream 时隐含在范围内。也就是说,编译器是在编译时为你填充相关类标签的编译器,现在 createDirectStream 有相关的隐含范围可以使用。

关于scala - 与 Scala 通用。没有可用于 T 的 ClassTag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49588195/

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