繁体   English   中英

在Scala中重写通用类型的方法时,如何返回具体类型?

[英]How do I return concrete type when overriding a generically typed method in Scala?

请查看以下代码段:

import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.Time
import org.apache.spark.streaming.Seconds

abstract class MQTTDStream[T <: Any](ssc: StreamingContext) extends DStream(ssc) {
  override def compute(validTime: Time): Option[RDD[T]] =
Some(ssc.sparkContext.parallelize(Seq(1, 2, 3), 1)) //This line doesn't compile

  override def dependencies = Nil

  override def slideDuration = Seconds(1) // just an example
}

我收到以下错误:

类型不匹配; 找到:Int(1)必需:T

我已经声明T扩展了Any,那么为什么编译器会抱怨呢? Int是Any的子类型,不是吗?

非常感谢!

更新:2.9.16:

更改为从DStream [Int]扩展,但仍然是相同的错误:

abstract class MQTTDStream[T](ssc: StreamingContext) extends DStream[Int](ssc) {
  override def compute(validTime: Time): Option[RDD[T]] =
Some(ssc.sparkContext.parallelize(Seq(1, 2, 3), 1)) //This line doesn't compile

  override def dependencies = Nil

  override def slideDuration = Seconds(1) // just an example
}

编辑:2.9.16:

感谢Alexey,这是有效的解决方案:

import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.streaming.StreamingContext
import org.apache.spark.rdd.RDD
import org.apache.spark.streaming.Time
import org.apache.spark.streaming.Seconds

abstract class MQTTDStream[T](ssc: StreamingContext) extends DStream[Int](ssc) {
  override def compute(validTime: Time): Option[RDD[Int]] =
    Some(ssc.sparkContext.parallelize(Seq(1, 2, 3), 1))

  override def dependencies = Nil

  override def slideDuration = Seconds(1) // just an example
}

呼叫者可以选择T ,而不是您。 因此,您的类定义必须适用于所有T (满足类型界限,但所有T都是Any子类型)。

也就是说,如果有人创建了例如MQTTDStream[String] ,则其compute方法必须返回Option[RDD[String]] 但是它没有:它返回Some[RDD[Int]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM