2014-01-14 109 views
0

在Scala中,给定一个对象斯卡拉型铸造

scala> f.get(c) 
res1: Object = 1 

scala> f.getType 
res3: Class[_] = int 

如何让

val a = 1 

,其中一个是int类型的,并且其中的类型是已知的仅来自f.getType。

+1

什么是'f'?你认为“类型是已知的”是什么意思?在编译时/运行时应该知道它吗? – sschaef

+0

感谢您的及时回复,详情请见http://stackoverflow.com/q/21090203/3189923。 – elm

+1

编译器不知道什么类对象getType返回,因此它应该如何构建一个真正的类型?这是基于编译时不可用的运行时信息。 – sschaef

回答

1

你不知道。假设你有这个:

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返回类型出现在运行时信息,那就是,该计划已被编译之后。

如果您需要这样做,请使用第二种替代方法,但是应该尝试找到不需要此类事物的不同设计。

+0

非常感谢Daniel! – elm