2016-09-02 1 views
0

Я пытаюсь проверить, существует ли поле в родовом классе.Как получить доступ к общему классу полей через scala-reflect и TypeTag (Scala 2.10)

import scala.reflect.runtime.{universe => ru}  
class Example[T:ru.TypeTag](val value:T) 

object Example { 
    def apply[T:ru.TypeTag](value:T, fieldName: String) : Example[T] = { 
    val t = ru.typeOf[T] 
    val hasField: Boolean = ??? // HOW CAN I CHECK THAT class T has the field with name fieldName? 

    if(hasField) 
     new Example(value) 
    else 
     throw new RuntimeException() 
    } 
} 

case class Foo(field:String) 
object Test{ 
    Example(Foo("hola"), "field") // WILL WORK 
    Example(Foo("hola"), "other") // THROWS EXCEPTION 
} 

Как это реализовать?

ответ

2

2,10:

val hasField = t.declarations.exists { _.name.decodedName.toString == fieldName } 

2,11:

val hasField = t.decls.exists { _.name.decodedName.toString == fieldName } 

редактировать: не заметил требование Scala 2.10 на первый

+1

Вы не проверять это поле. Он также вернет true, если есть метод или член типа с этим именем. –

+0

@ AlexeyRomanov абсолютно прав! Вы можете использовать методы 'isXXX' для' universe.Symbol' для фильтрации соответственно: 't.declarations.exists {x =>! X.isMethod && ...}' –

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