在Scala中,给定一个对象斯卡拉型铸造
scala> f.get(c)
res1: Object = 1
和
scala> f.getType
res3: Class[_] = int
如何让
val a = 1
,其中一个是int类型的,并且其中的类型是已知的仅来自f.getType。
在Scala中,给定一个对象斯卡拉型铸造
scala> f.get(c)
res1: Object = 1
和
scala> f.getType
res3: Class[_] = int
如何让
val a = 1
,其中一个是int类型的,并且其中的类型是已知的仅来自f.getType。
你不知道。假设你有这个:
f.getType match {
case x if x ifAssignableFrom classOf[Int] =>
val a = f.get(c).asInstanceOf[Int]
}
有两个问题。首先,它使用asInstanceOf
,你永远不应该这样做。其次,val a
的范围是案例陈述。一个稍微好一点的做法是这样的:
f.get(c) match {
case a: Int =>
}
这是更好,因为a
只会是一个Int
如果是真的一个Int
。来自f.getType
的信息基本上是无用的,因为它可能是对的,而实际类型总是如此。
尽管如此,范围是有限的,而且它确实不能以任何其他方式。当你说val a: Int = f.get(c)
,你在编译时间处宣布,即a
将总是从Int
开始,直到它的范围结束。
同时,f.get(c)
和f.getType
返回类型出现在运行时信息,那就是,该计划已被编译之后。
如果您需要这样做,请使用第二种替代方法,但是应该尝试找到不需要此类事物的不同设计。
非常感谢Daniel! – elm
什么是'f'?你认为“类型是已知的”是什么意思?在编译时/运行时应该知道它吗? – sschaef
感谢您的及时回复,详情请见http://stackoverflow.com/q/21090203/3189923。 – elm
编译器不知道什么类对象getType返回,因此它应该如何构建一个真正的类型?这是基于编译时不可用的运行时信息。 – sschaef