2016-08-31 7 views
-1

は、次のコードスニペットを見てください。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 
} 

私は次のエラーを取得:

type mismatch; found : Int(1) required: T

を私はどれを拡張するためにTを宣言した、なぜコンパイラが文句を言っていますか? IntはAnyのサブタイプですね。

ありがとうございます!

アップデート:2.9.16:

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 
} 

EDIT:2.9.16:アレクセイへ

おかげで、このDSTREAM [INT]から延びているが、それでも同じエラーに変更

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 
} 
+0

どういう意味ですか?T <:Any?すべてのタイプはAnyのサブタイプです。また、どのラインがエラーを投げているのか明確ではない。 – Samar

+1

は、コンパイルしていない行にコメントを追加しました –

答えて

2

呼び出し元がTを選択します。 。そのため、クラス定義はすべてT(タイプ境界を満たしていますが、すべてTはサブタイプAny)で動作する必要があります。

つまり、誰かが作成した場合。 a MQTTDStream[String]の場合、computeメソッドはOption[RDD[String]]を返す必要があります。しかし、それはSome[RDD[Int]]を返します。

+0

これは、Seq(1、2、3)を戻り値の型としてハードコードする方法を意味しません。 –

+0

'DStream [Int]'(または '[AnyVal]'や '[Any]')を拡張する場合に限ります。 –

+0

こんにちはAlexey、私はコードを変更しました(上記参照)、同じエラーを受け取りました –

関連する問題