我正在使用一个库-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版本,但是可以将我链接到哪里?

10-08 18:42