2016-11-13 1 views
2

リフレクションを使用して、指定されたクラスのコンストラクタを反復しようとしています。 問題は、各要素に対して何かをしてから、ある述語に一致するものだけを返す必要があるということです。私がいないだけで(各要素に対して何かを呼び出す必要があるため、私は、これは理解のために行うことができるかどうかわからないんだけどスカラflatMapのgetConstructorsメソッド(リフレクション)

argument expression's type is not compatible with formal parameter type; 
found : java.lang.reflect.Constructor[_] => Iterable[java.lang.reflect.Constructor[?0(in value $anonfun)]] forSome { type ?0(in value $anonfun) } 
required: java.lang.reflect.Constructor[_] => scala.collection.GenTraversableOnce[?B] 

:次のコードは、例外

classOf[String].getConstructors.flatMap(x=> doSomething(x); if(predicate(x)) Some(x) else None) 

例外がスローされます述語を保持しているもの):c.getMethodsを呼び出す

for{ 
    x <- c.getConsturctors 
    //doSomething(x) ?? 
    if predicate(x) 
}yield{ 
    //doSomething(x) - only for the ones that holds the predicate 
    x 
} 

ので、私は)それは戻り値の型アレイ[コンストラクタ[_]]対(配列[方法]とは何かを持って推測している動作します... ?

回答

はflatMap - アレクセイ・ロマノフ(pamuの助けを借りて)理解のための

答え:

for{ 
    x <- c.getConsturctors 
    _ = doSomething(x) 
    if predicate(x) 
}yield x 
+0

doSomethingと述語が正確に間違っていることを伝えるための詳細情報が必要 – pamu

+0

doSomethingはxを出力し、述語は真を返します。 –

答えて

1

を使用してflatMap

classOf[String].getConstructors.toList.flatMap { elem => 
    doSomething(elem); 
    if (predicate(elem)) { 
    List(elem) 
    } else List() 
} 

を使用して、ScalaはあなたがIterable[java.lang.reflect.Constructor[A] forSome { type A }]たいIterable[java.lang.reflect.Constructor[A]] forSome { type A }(または短くし、Iterable[java.lang.reflect.Constructor[_]])で終わります。

c.getConstructors.flatMap { x => 
    doSomething(x) 
    (if (predicate(x)) Some(x) else None): Option[Constructor[_]] 
} 

を私は問題が生じた理由を私はが表示されていない認めなければならない:タイプが動作するはず注釈。

+0

ya私は暗黙のことと関係があると思います..なぜ誰かが知っているかどうか知ることはまだ興味深い.. –

1

利用collect代わりのflatMap、その後Someを返す、None

classOf[String].getConstructors.toList 
    .collect { case elem if predicate(elem) => doSomething(elem) } 

により型推論の実装の詳細にについて、理解

for { 
elem <- classOf[String].getConstructors.toList 
_ = doSomething(elem) 
val result = if (predicate(elem) List(elem) else List() 
} yield result 
+0

それは動作しますが(ifはcase節の中にあるべきです) doは、述語の結果に関係なく、各繰り返しで呼び出されます)。とにかく私はflatMapを使って、または理解のために問題を解決する方法を探しています。 –

+0

フラットマップについて - 私はリストを望んでいませんが、オプションです。 forは便利ですが、私はそれを次のように変更します:... if(predicate(elem))} elem –

+0

"リストは必要ありませんがオプション"オプションはリストに変換されます。タイプ。 –

関連する問題