-1

次のコード スニペットをご覧ください。

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:

アレクセイのおかげで、これは実用的なソリューションです:

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
}
4

1 に答える 1

2

あなたではなく、発信者が を選択Tします。したがって、クラス定義はすべてに対して機能する必要がありますT(これは型の境界を満たしますが、すべてTが のサブタイプですAny)。

つまり、誰かがたとえば を作成した場合MQTTDStream[String]、そのcomputeメソッドは を返す必要がありOption[RDD[String]]ます。しかし、そうではありません: を返しますSome[RDD[Int]]

于 2016-08-31T20:35:02.123 に答える