2017-02-16 19 views
1

Следующий код не компиляции:Scala компилятор говорит: "Нет TypeTag для Т" в методе с использованием дженериков

override def read[T <: Product](collection : String): Dataset[T] = { 
    val mongoDbRdd = MongoSpark.load(sparkSession.sparkContext,MongoDBConfiguration.toReadConfig(collection)) 
    mongoDbRdd.toDS[T] 
} 

Это "TODS" определение:

def toDS[T <: Product: TypeTag: NotNothing](): Dataset[T] = mongoSpark.toDS[T]() 

Компилятор говорит:

Error:(11, 20) No TypeTag available for T 
    mongoDbRdd.toDS[T] 

Error:(11, 20) not enough arguments for method toDS: (implicit evidence$3: reflect.runtime.universe.TypeTag[T], implicit evidence$4: com.mongodb.spark.NotNothing[T])org.apache.spark.sql.Dataset[T]. 
Unspecified value parameters evidence$3, evidence$4. 
    mongoDbRdd.toDS[T] 

линия 11 является mongoDbRdd.toDS[T]

Я действительно не знаю, что происходит с Scala Generics, и компилятор не очень конкретный, любая идея?

+0

Где 'Product' заявленным? – nmat

+0

Его от Scala (пакет scala) – italktothewind

ответ

1

Проблема с ограничениями типа на T что toDS требует:

// The ':' constraint is a type class constraint. 
def toDS[T <: Product: TypeTag: NotNothing](): Dataset[T] = 
    mongoSpark.toDS[T]() 

// The below is exactly the same as the above, although with user-defined 
// names for the implicit parameters. 
// All a type class does is append implicit parameters to your function. 
def toDS[T <: Product]()(implicit typeTag: TypeTag[T], notNothing: NotNothing[T]) = 
    mongoSpark.toDS[T]() 

Вы заметите, что это то, что ваша ошибка компилятора показывает - с именами расширены evidence$3 и evidence$4.

Если вы хотите, чтобы ваш метод компиляции, просто добавьте те же классы типа:

override def read[T <: Product: TypeTag: NotNothing](
    collection : String): Dataset[T] = { /* impl */ } 
+0

Я уже пробовал это, но ошибки еще хуже: Ошибка: (11, 24) javassist.bytecode.stackmap.TypeTag не принимает параметры типа def read [T <: Продукт: TypeTag: NotNothing] (коллекция: String): Dataset [T] = { Ошибка: (13, 20) Нет ТипTag доступен для T mongoDbRdd.toDS [T] Ошибка: (13, 20) недостаточно аргументов для метод toDS: (неявные доказательства $ 3: reflect.runtime.universe.TypeTag [T], неявные доказательства $ 4: com.mongb.spark.NotNothing [T]) org.apache.spark.sql.Dataset [T]. Неопределенные значения параметров доказательство $ 3, доказательство $ 4. mongoDbRdd.toDS [T] – italktothewind

+0

Если вы внимательно посмотрите на сообщение об ошибке, вы увидите, что у вас есть неправильный класс TypeTag в области видимости ('javassist.bytecode.stackmap.TypeTag'). Убедитесь, что вы импортируете 'reflect.runtime.universe.TypeTag'. – jkinkead

+0

Это было то, спасибо! – italktothewind

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

  • Нет связанных вопросов^_^