我正在使用一个库-HtmlUnit-我刚刚从2.4版更新到2.5版。当我针对2.5编译代码时,我收到了一个我不熟悉的奇怪对象“无法取消引用”错误消息。而且,当我两行编写代码时,我不明白为什么它能工作,但是当我以单行代码的形式来工作时却失败了。
这是代码:
//this compiles fine
HtmlInput usernameInput = form.getInputByName("username");
usernameInput.setValueAttribute(userName);
//this fails to compile
form.getInputByName("password").setValueAttribute(passWord);
这是我使用ANT和Java 1.6进行编译时收到的错误消息:
[javac] E:\workspaces\europa\PortalTestSuite\src\com\carefirst\portal\test\controller\EAITest.java:32: com.gargoylesoftware.htmlunit.html.HtmlInput cannot be dereferenced
[javac] form.getInputByName("password").setValueAttribute(passWord);
[javac] ^
com.gargoylesoftware.htmlunit.html.HtmlInput无法取消引用?我见过自动装箱的解除引用问题,但对象没有。在这种情况下是什么意思?为什么代码以一种方式而不是另一种方式工作?
最佳答案
函数form.getInputByName被声明为final,如javadoc here中所示
HtmlInput对象是抽象的,因此在运行时它总是由扩展HtmlInput的对象实现。
由于最终方法的性质(永远不会被覆盖,所以没有调用栈)导致错误发生,因为编译器将其视为htmlinput而不是实现的htmlinput。(ref)(他认为将没有调用栈)
将其分配给新的htmlinput对象正确调用了调用栈,从而使代码再次可行。
多数民众赞成在我想这是怎么回事
虽然我以某种方式无法找到2.5版本,但是可以将我链接到哪里?