1

私はこれをグーグルで検索するのに苦労しています。たくさんの記事を見つけましたが、それでも問題を解決できません。

これが私のコードです:

List<MyMainClass> mySource = (List<MyMainClass>) session.getAttribute("myAttribute");

session.getAttribute( "myAttribute")List<MyObject1>またはを返す場合がありList<MyObject2>ます。との両方がサブクラスにMyObject1なりました。2つの関数があります。最初のものは受け入れ、もう1つは受け入れます。今、私は日食でエラーが発生していますMyObject2MyMainClassList<MyObject1>List<MyObject2>

The method myMethod1(List<MyObject1>) in the type MyAction is not applicable for the arguments (List<MyMainClass>)

4

4 に答える 4

1

List同じ消去( )を持つ異なる汎用タイプをセッション属性に安全に格納することはできません。だから:それをしないでください。

代わりに、そのセッション属性のリストタイプに関係なく互換性があるように、コードをリファクタリングします。これは難しいかもしれませんが、長期的には臭いが少ないようです。IME、1つの変数に異なるタイプの可能性のある2つのものを格納する必要がある場合、一般的にデザインが貧弱な匂いがします。

2つの異なるセッション属性を交互に使用して、キャスト先のより具体的なリストタイプを知ることができます。

List<MyObject1> mySource1 = (List<MyObject1>) session.getAttribute("myAttribute1");
if (mySource1 == null) {
    List<MyObject2> mySource2 = (List<MyObject2>) session.getAttribute("myAttribute2");
    if (mySource2 == null) {
        // ???
    } else {
        // rock and roll
        myMethod2(mySource2);
    }
} else {
    // proceed
    myMethod1(mySource1);
}

後者のアプローチを採用する場合は、それらの詳細を管理するラッパーオブジェクトまたはメソッドを作成することをお勧めします。

于 2012-10-30T03:24:32.857 に答える
0

可能であれば、 mySourceと関数シグネチャの宣言方法を変更することをお勧めします。

このように宣言します。

    List<? extends MyMainClass> mySource = (List<MyMainClass>) 

session.getAttribute("myAttribute");

そして、関数のシグネチャをから変更します

returnType fun(List<Object1> object1List){
}

returnType fun(List<? extends MyMainClass> object1List){
}
于 2012-10-30T03:40:08.910 に答える
0

それは正しいです。Genericsは、コンパイル時の保護のみを提供します。より一般的なタイプのリストを、より具体的なタイプのタイプlistの関数に渡そうとしています。

のインスタンスはとList<MyMainClass>の両方のインスタンスを保持できることを理解してください。この関数を呼び出すと、リストのすべての要素がタイプであることが期待されます。したがって、タイプのリストを渡すことはできません。MyObject1MyObject2function1(List<MyObject1>)MyObject1List<MyMainClass>

さまざまなタイプのリストを格納するには、識別可能な変数が必要です。

于 2012-10-30T03:28:57.783 に答える
0

アドバイスされているように、これは少し注意が必要です。あなたが本当にそれをしたいのなら、私はあなたが以下のようにこれを行うことができると思います:

 List<MyMainClass> mySource = 
                           (List<MyMainClass>) session.getAttribute("myAttribute");
 if(mySource != null && !mySource.isEmpty()){
      //Get the first element and check the type
      MyMainClass firstElement = mySource.get(0);
      if(firstElement instanceof MyObject1){
          List<MyObject1> mySourceObj1 = (List<MyObject1>)mySource;
          myMethod1(mySourceObj1);
      }else{
          List<MyObject3> mySourceObj2 = (List<MyObject2>)mySource;
          myMethod1(mySourceObj2);
      }
  } 
于 2012-10-30T03:36:01.423 に答える