2009-09-04 17 views
2

はあなたが哺乳類私の()と人間の私は()natuarlly overidedされており、これは完璧に動作し、それが必要としてWSDLが生成されて表示された場合、私は今、次のstrucutreJavaのWebサービスおよび多型

public class Mammal 
{ 
    @WebMethod 
    public ArrayList<Mammal> getAll(){ return null; } 
    @WebMethod 
    public String speak(){ return "Unable to speak"; } 
    @WebMethod 
    public Mammal me(){ return this; } 
} 

@WebService 
public class Human extends Mammal 
{ 
    @WebMethod 
    public ArrayList<Human> getAll(){ /* code to return all humans as ArrayList<Human> */ } 
    @WebMethod 
    public String speak() { return "Hai!"; } 
    @WebMethod(operationName="GetHuman") 
    public Human me(){ return this; } 
} 

を持っているとしましょうそれは私がoperationName = ""を追加するためです。

これまでのところ、ArrayListを返すメソッドはうまくいきません。 ArrayListは私の考えでは可能なArrayListをオーバーライドできません。

は今、私はこのために回避策発見し、結果がMammalクラスで続い

ように見える私の代わりにこれがあります。public ArrayList getAll(){ return null; }

を、私は今、この作品、手つかずHumnaクラスを残します。

ただし、これは、人間を拡張して新しいサブクラスからメソッドをオーバーライドすることは不可能なので、再び正方形に戻ります。

どうすれば解決できますか?

C#アプリケーションからWebサービスにアクセスしたいとしましょう。メソッドの戻り値の型がList HumanまたはList Whatever-extended-Mammalです。反対側に型キャストする必要はありません。

答えて

4

あなたのコード例では、Webサービス関連の注釈がなくてもコンパイルべきではありません。 List<Human>で、のサブタイプはList<Mammal>です。しかし、基本クラスにList<? extends Mammal>を使用すると、すべてうまくいくはずです。

public class Mammal 
{ 
    @WebMethod 
    public List<? extends Mammal> getAll() { return null; } 
} 

public class Human extends Mammal { 
    @WebMethod 
    public List<Human> getAll() { return null; } 
} 

あなたはさらにHumanを拡張したい場合は、あなたが

public class Human extends Mammal { 
    @WebMethod 
    public List<? extends Human> getAll() { return null; } 
} 
+0

恐ろしい、これを試してみよう。 –

+0

完璧に動作します、ありがとうございます。 <?いくつかのJavaマジックを拡張しますか? :) –

+0

これは、「境界付きワイルドカードパラメータ化タイプ」と呼ばれます。 Javaのジェネリックに関するFAQはここにあります:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html – janko

0

コレクションの代わりに実際の配列を使用するとどうなりますか?私は、Webサービスフレームワークがジェネリックでうまくいくとは思わない。

EDIT:そのような何か:

public class Mammal 
{ 

    @WebMethod 
    public Mammal[] getAll() { return null; } 

    ... 

} 

@WebService 
public class Human extends Mammal 
{ 

    @WebMethod 
    public Human[] getAll() { return null; } 

    ... 

} 
+0

を使用する必要がありますそれはコレクションで完璧に動作します。コレクションの代わりに "実際の"配列を使用すると、webserviceを呼び出すときの結果は、Human [] me()を呼び出すときにMammal []となるスーパークラス戻り型です。それは間違っています。 –

+0

Java 5では、新しい戻り値の型が宣言された戻り値の型のサブタイプである限り、オーバーライドするメソッドの戻り値の型を変更することができます。 –

+0

あなたはそれを試しましたか? Webserviceとして公開すると、Human.getAll()はまだMammalを返します。 –

関連する問題