2

我正在使用一个库 - HtmlUnit - 我刚刚从 2.4 版更新到 2.5 版。当我针对 2.5 编译代码时,我收到一个我不熟悉的奇怪对象“无法取消引用”错误消息。此外,我不明白为什么当我用两行代码编写代码时它会起作用,但当我作为 one-liner 编写代码时却失败了。

这是代码:

//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 不能被取消引用?我已经看到了 Autoboxing 的取消引用问题,但没有看到对象的问题。在这种情况下是什么意思?为什么代码以一种方式工作而不是另一种?

4

2 回答 2

5

事实上,这是另一个问题。

API 是public final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundException.

I这意味着该方法返回( I extends HtmlInput)的一个实例。

当你写:

HtmlInput usernameInput = form.getInputByName("username");

-> 类 I 隐含地是一个 HtmlInput。

但是当你写:

form.getInputByName("password").setValueAttribute(passWord);

-> 无法明确找到我的课程。

如果你想让它工作,你必须写:

form.<HtmlInput>getInputByName("password").setValueAttribute(passWord);

-> 这迫使我成为一个 HtmlInput。

热诚地,杰罗姆。

于 2009-10-21T07:53:33.477 回答
3

函数 form.getInputByName 被声明为 final,如这里的 javadoc 中所示

对象 HtmlInput 是抽象的,因此在运行时它总是由扩展 HtmlInput 的对象实现。

由于最终方法的性质(它永远不会被覆盖,因此没有调用堆栈),错误的出现是因为编译器将其视为 htmlinput 而不是已实现的 htmlinput。(ref)(他认为不会有调用堆栈)将其分配给一个新的 htmlinput 对象正确地调用了调用堆栈,从而使代码再次可行。

这就是我认为这里发生的事情

虽然我不知何故找不到 2.5 版,但你能把我链接到哪里吗?

于 2009-04-14T21:33:44.123 回答