2016-09-02 7 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 } 

編集:あなたは、それはフィールドのチェックされていない最初の

+1

でScalaの2.10要件に気付きませんでした。この名前のメソッドまたは型メンバーがある場合はtrueを返します。 –

+0

@AlexeyRomanovはまったく正しい! 'universe.Symbol'の' isXXX'メソッドを使ってそれに応じてフィルタリングすることができます: 't.declarations.exists {x =>!x.isMethod && ...}' –

関連する問題