何时使用asInstanceOf?

时间:2016-11-09 10:43:31

标签: scala scala.js

我正在尝试使用scalajs,并对使用org.scalajs.dom.html包访问DOM元素感到困惑。 通过反复试验,我发现某些元素需要使用asInstanceOf转换为某些类型,但有些则不需要。关于何时何地需要使用asInstanceOf,是否有一般规则?

例如,假设我有一个标识为input的{​​{1}}元素。为了访问输入的值,我需要使用myinput

asInstanceOf

但是当我的val content = document.getElementById("myinput").asInstanceOf[html.Input].value 身份content中显示div时,编译器在我没有使用contentdiv时没有抱怨asInstanceOf元素:

div

另外,作为奖励,有一个中心位置可以找到所有可能的val mydiv = document.getElementById("contentdiv") mydiv.innerHTML = content 参数以及它们与实际HTML元素的映射吗?

2 个答案:

答案 0 :(得分:3)

getElementById的签名是

def getElementById(id: String): DOMElement

DOMElement定义为

trait DOMElement extends js.Object {
  var innerHTML: String = js.native

  def appendChild(child: DOMElement): Unit = js.native
}

因此,每当您致电getElementById时,您都会获得DOMElement,而您可以执行的唯一操作是innerHTMLappendChild

这就是为什么你的最后一个例子没有明确的强制转换的原因。

但是DOMElement是一种非常通用的类型。有时您知道 getElementById会返回 - 比如说 - <input>元素。

当你可以使用asInstanceOf通知编译器你有这方面的额外知识时。

document.getElementById("myinput").asInstanceOf[html.Input].value
                                      ^
                                      |
          hey compiler, I KNOW this is going to be an html.Input,
            please let me do my things and explode otherwise.

毋庸置疑,使用asInstanceOf时需要小心。如果你错了,这次编译器就不能让你免于运行时崩溃。

答案 1 :(得分:1)

回答问题的第二部分:

  

是否有一个中心位置可以找到所有可能的capture参数以及它们与实际HTML元素的映射?

您可以在Html.scala中搜索“extends HTMLElement”。