2016-08-31 1 views
-1

s'il vous plaît jeter un oeil à l'extrait de code suivant:Comment renvoyer un type concret lors de la substitution d'une méthode générique dans 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 
} 

Je reçois l'erreur suivante:

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

J'ai déclaré T à prolonger tout, alors pourquoi le compilateur plaignais? Int est un sous-type de Any, n'est-ce pas?

Merci beaucoup!

Mise à jour: 2.9.16:

Changé pour prolonger de DSTREAM [Int], mais toujours la même erreur:

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:

Merci à Alexey, cette est la solution de travail:

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

quel est le point de dire T <: Any? Tous les types sont des sous-types de Any. Aussi, ce n'est pas clair quelle ligne est en train de lancer une erreur. – Samar

+1

vient d'ajouter un commentaire sur la ligne qui ne compile pas –

Répondre

2

l'appelant doit choisir T, pas vous . Donc, votre définition de classe doit fonctionner pour tous T (qui satisfait les limites de type, mais tous les T sont des sous-types de).

Autrement dit, si quelqu'un crée par ex. MQTTDStream[String], puis sa méthode compute doit retourner un Option[RDD[String]]. Mais ce n'est pas le cas: il renvoie .

+0

Ok, donc cela signifie aucun moyen de Seq code dur (1, 2, 3) comme type de retour, correct? –

+0

Vous pouvez, mais seulement si vous étendez 'DStream [Int]' (ou '[AnyVal]' ou '[Any]'). –

+0

Salut Alexey, j'ai changé le code (voir ci-dessus) obtenant toujours la même erreur –