2

ライブラリ - HtmlUnit - を使用していますが、バージョン 2.4 からバージョン 2.5 に更新しました。コードを 2.5 に対してコンパイルすると、見慣れないオブジェクト "cannot be dereferenced" という奇妙なエラー メッセージが表示されます。また、コードを2行で書くと機能するのに、ワンライナーで書くと失敗する理由がわかりません。

コードは次のとおりです。

//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 は逆参照できませんか? オートボクシングで逆参照の問題が発生しましたが、オブジェクトでは発生しませんでした。この文脈でそれはどういう意味ですか?また、コードが一方の方向に機能し、他方の方向には機能しないのはなぜですか?

4

2 に答える 2

5

実際、それは別の問題です。

APIはpublic final <I extends HtmlInput> I getInputByName(String name) throws ElementNotFoundExceptionです。

これは、メソッドがII extends HtmlInput)のインスタンスを返すことを意味します。

あなたが書くとき:

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

->クラスIは暗黙的にHtmlInputです。

しかし、あなたが書くとき:

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

->明示的に見つからないクラス。

それを機能させたい場合は、次のように書く必要があります。

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

->これにより、IはHtmlInputになります。

心から、ジェローム。

于 2009-10-21T07:53:33.477 に答える
3

関数 form.getInputByName は、こちらの javadoc に示されているように final として宣言されています。

オブジェクト HtmlInput は抽象的であるため、実行時には常に HtmlInput を拡張するオブジェクトによって実装されます。

final メソッドの性質上 (決してオーバーライドされないため、コールスタックはありません)、コンパイラはそれを実装された htmlinput ではなく単なる htmlinput と見なすため、エラーが発生します。( ref )(彼はコールスタックがないと考えています)新しい htmlinput オブジェクトがコールスタックを正しく呼び出すため、コードが再び実行可能になります。

それが私がここで起こっていると思うことです

どういうわけかバージョン 2.5 を見つけることができませんが、どこで入手したかリンクしてもらえますか?

于 2009-04-14T21:33:44.123 に答える