したがって、グラスフィッシュサーバーで実行され、いくつかのWebメソッドを含むmysqlデータベースに接続するこのWebサービスがあります。
@WebMethod(operationName = "getDrops")
public Dropslog[] getDrops(@WebParam(name = "User") Users user, @WebParam(name = "MonsterID") int monsterID){
return dbmg.getDrops(user, monsterID);
}
ご覧のとおり、このメソッドは別のクラスからこのメソッドを呼び出すことで、Dropslog[] 型の変数を返します。
public Dropslog[] getDrops(Users user, int monsterID){
Dropslog drop;
Criteria criteria = session.createCriteria(Dropslog.class);
criteria.add(Restrictions.eq("monsterId", monsterID));
drop = (Dropslog) criteria.uniqueResult();
List<Dropslog> drops = (List<Dropslog>) criteria.list();
Dropslog[] dropsArray = new Dropslog[drops.size()];
dropsArray = drops.toArray(dropsArray);
return dropsArray;
}
このメソッドは以前はdrops
which の型を返していましたが、SOAP Web サービスはリストを返せないことをここList<Dropslog>
で読んだので変更しました。
クライアント側のアプリケーションは、次のコードを使用して webmethod getDrops を呼び出します。
public static Dropslog[] getDrops(webservice.Users user, int monsterID){
webservice.PvmWs service = new webservice.PvmWs();
webservice.ClientHandler port = service.getClientHandlerPort();
return port.getDrops(user, monsterID);
}
したがって、これまで見てきたように、これは完全に機能するはずですが、実際には機能しません。代わりに、最後のメソッドの戻り行にマークされた NetBeans に関する互換性のない型エラーのヒントが表示されます。
incompatible types
required: Dropslog[]
found: List<Dropslog>
驚いたことに、NetBeans が提案するように変更すると、コンパイルして動作します。なぜこれが起こるのか、そして何らかのバグまたはどういうわけかnetbeansが古いファイルを使用してコードをコンパイルしているのか、それともJavaが何らかの自動キャストを行っているのか疑問に思っていましたか?