【发布时间】:2014-01-13 11:30:46
【问题描述】:
想请教如何在Scala中实现以下功能。考虑
scala> case class C(i:Int)
defined class C
scala> val c = C(1)
c: C = C(1)
给定一个感兴趣的领域,在这种情况下
scala> val fname = "i"
fname: String = i
我们想检索 c 中字段 i 的原始值和类型。
第一次天真的尝试包括以下内容,
scala> val f = c.getClass.getDeclaredField(fname)
f: java.lang.reflect.Field = private final int C.i
scala> f.setAccessible(true)
scala> f.getType
res3: Class[_] = int
然而,
scala> val a:Int = f.get(c)
<console>:11: error: type mismatch;
found : Object
required: Int
val a:Int = f.get(c)
^
换句话说,如何在 c (*) 中获取 i 的 Int 值
scala> :type -v case class C(i:Int)
// Type signature
AnyRef
with Product
with Serializable {
val i: Int <----------------------- (*)
private[this] val i: Int
def <init>(i: Int): C
def copy(i: Int): C
...
对于不一定是 Int 类型,考虑 D 中的字段 j,
scala> case class C(i:Int)
defined class C
scala> case class D(j:C)
defined class D
scala> :type -v case class D(j:C)
// Type signature
AnyRef
with Product
with Serializable {
val j: C
private[this] val j: C
def <init>(j: C): D
def copy(j: C): D
...
非常感谢...
总结
给定
scala> f.get(c)
res1: Object = 1
和
scala> f.getType
res3: Class[_] = int
如何获得
val a = 1
其中 a 是 Int 类型,并且仅从 f.getType 知道类型。
【问题讨论】:
-
如果你使用反射来获取它的值,你怎么能指望它在没有演员表的情况下工作?编译器不知道名为
"i"的字段的类型(也不知道它是否真的存在)。
标签: scala reflection types casting field