Ich versuche, über die Konstruktoren einer bestimmten Klasse mit Reflektion zu iterieren. Das Problem ist, dass ich etwas zu jedem Element machen muss und dann nur diejenigen zurückgeben muss, die mit einem Prädikat übereinstimmen. der folgende Code wirft AusnahmeScala flatMap über getConstructors-Methode (Reflexion)
classOf[String].getConstructors.flatMap(x=> doSomething(x); if(predicate(x)) Some(x) else None)
Die Ausnahme:
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]
Ich bin nicht sicher, ob dies mit für das Verständnis getan werden kann, weil ich etwas für jedes Element tun müssen, rufen Sie (nicht nur für die diejenigen, die das Prädikat) gilt:
for{
x <- c.getConsturctors
//doSomething(x) ??
if predicate(x)
}yield{
//doSomething(x) - only for the ones that holds the predicate
x
}
Aufruf c.getMethods funktioniert so etwas hat es ich vermute, mit dem Rückgabetyp (Array [Methoden] vs Array [Constructor [_]]) zu tun ... ?
Antwort:
flatMap - Alexey Romanov
für das Verständnis beantworten (mit Hilfe von Pamu):
for{
x <- c.getConsturctors
_ = doSomething(x)
if predicate(x)
}yield x
Benötigen Sie weitere Informationen über 'doSomething' und' Prädikat' um zu sagen, was genau falsch ist – pamu
Es ist nicht wirklich wichtig, sagen DoSomething druckt x und Prädikat gibt nur zurück –