2015-11-22 3 views
0

Я написал метод, который получает тип признака в качестве ввода. Это черта Localizable:Scala trait как метод input - ошибка несоответствия типа

import com.vividsolutions.jts.geom.Coordinate 
trait Localizable { 
    val location : Coordinate 
} 

Это метод:

def localizeWithId(rdd : RDD[Localizable]) : RDD[(BigInt,Localizable)] = { 
    return rdd.map { case place => 
    (getIdFromLocation(place.location.x, place.location.y), place) 
    } 
} 

Вопрос заключается в том, что, когда я пытаюсь вызвать этот метод, и послать класс случай, который расширяет эту черту в качестве параметра , Я получаю ошибку несоответствия типа.

Это тот случай, класс:

case class At (
    eventDate : DateTime, 
    location : Coordinate 
) extends Localizable 

и это вызов:

val ats : RDD[At] = ... 
val atsLocalized : RDD[(BigInt, At)] = localizeWithId(ats) 

Как я могу решить эту проблему? Благодарю.

+1

Ваша проблема может заключаться в том, что вы запросили ожидаемый тип как 'RDD [(BigInt, At)]', в то время как фактический тип возврата - это 'RDD [(BigInt, Localizable)]', который является несоответствием типа, что бы вы не получили. Решение может заключаться в определении 'def localizeWithId [A <: Localizable] (rdd: RDD [A]): ​​RDD [(BigInt, A)]' –

+0

Спасибо! это прекрасно – Yoav

+0

ok, позвольте мне опубликовать это как ответ, затем –

ответ

4

Ваша проблема в том, что здесь:

val atsLocalized : RDD[(BigInt, At)] = localizeWithId(ats) 

вы сказали, что вы ожидаете RDD[(BigInt, At)] быть возвращены, в то время как фактический тип возвращаемого объявлен как РДУ [(BigInt, Localizable)].

RDD инвариантно, так что вы не можете поставить RDD[B] где RDD[A], как ожидается, даже если B будет подтипом A. Но в любом случае это не так.

Вы можете сделать свой метод родовое так:

def localizeWithId[A <: Localizable](rdd: RDD[A]): RDD[(BigInt, A)] 

требует A быть подтипом вашего признака.

Смежные вопросы