[英]How can I improve Scala's type inference with type parameters that don't show up in the first parameter list?
[英]Why don't Scala primitives show up as type parameters in Java reflection?
給出以下案例類:
case class Foo(
bar: Int,
baz: Boolean,
qux: Option[Int],
quux: Option[Boolean],
quuux: Option[Integer]
)
我希望如下:
for (f <- classOf[Foo].getDeclaredFields) {
println(f.getGenericType)
}
產生類似的東西:
int
boolean
scala.Option<int>
scala.Option<boolean>
scala.Option<java.lang.Integer>
但相反,它產生:
int
boolean
scala.Option<java.lang.Object>
scala.Option<java.lang.Object>
scala.Option<java.lang.Integer>
為什么原語會從泛型中刪除,而不是被視為java.lang.Integer.TYPE
和java.lang.Boolean.TYPE
,就像普通字段一樣?
有沒有辦法從classOf[Foo]
檢索原始類型參數?
Scala認為基元的通用參數是scala.<Primitive>
例如scala.Int
。 它不會將類型存儲在Java類文件中,盡管可以說它可以。 (或者不是;取決於是否需要區分Int
和java.lang.Integer
;框內形式是java.lang.Integer
,即使編譯器做得很好,你也相信它是Int
。 )
無論如何,Scala有自己的反射功能,但是在2.10你可以找到Option
類型的參數,如下所示:
import scala.reflect.runtime.universe._
typeTag[Foo].tpe.members.collect{
case m: MethodSymbol if m.isCaseAccessor => m
}.foreach(m => println(m.name + " " + m.typeSignature))
你會得到類似的東西
quuux => scala.Option[java.lang.Integer]
quux => scala.Option[scala.Boolean]
qux => scala.Option[scala.Int]
baz => scala.Boolean
bar => scala.Int
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.