3

次のコードを理解しようとしています。

class Test<E extends SubTest>
{
    List<Vector<E>> links;

    Test()
    {
        links = MyStaticClass.aList;
        // Where aList is static ArrayList<Vector<SubTest>>;
    }
}

ArrayList以下をリンクリストに割り当てるとエラーが発生するのはなぜですか。SubTestでEを拡張したことを考えると、割り当てを理解できませんでした。

パラメータ T t; がある場合 私は t プロパティにアクセスできますが、前述のアッシングを行うことはできません。とにかくList<Vector<T>>リンクが得られることを期待しませArrayList<Vector<SubTest>>んか?

4

3 に答える 3

5

エラーを誤解しています。

実際の問題はE、 と同じではないことですSubTest

Test<SubSubTest>( where SubSubTestinherits )のインスタンスを作成すると、コードはs のコレクション (任意の派生クラスを保持できる) を型の変数( のみを保持できる)SubTestに入れようとします。SubTestList<Vector<SubSubTest>>SubSubTest

于 2012-12-17T21:44:56.457 に答える
0

これを試してください:

    Test<SubTest> x = new Test<SubTest>();
    x.links = MyStaticClass.aList;

で型パラメーターをインスタンス化しEますSubTest。それは妥当な期待です。しかし問題は、コンストラクターがnewキーワードで呼び出されたときに型パラメーターがインスタンス化されることです。あなたの間違いは、コンストラクターの本体でインスタンス化しようとすることです。コンストラクターの本体では、Eそれが何であるかを処理する必要があります。つまり、まだインスタンス化されていないパラメーターです。

後で でインスタンス化する可能性がありEますEsotericSubSubTest。コンストラクターで割り当てを行うと、タイプの値をタイプArrayList<Vector<SubTest>>のフィールドに割り当てることになりますが、List<Vector<EsotericSubSubTest>>これは間違いです。

于 2012-12-17T22:28:59.707 に答える
0

私の経験によると、クラスの定義Eでは、コンパイル時にクラスの実際の名前をジェネリックの代わりに使用することはできません。E は Subtest から派生していますが、E はジェネリック型であり、Subtest はクラスです。したがって、この問題は特に によって引き起こされるのではなく、ジェネリック型の代わりにクラスが使用されているSubtestためです。

これはあなたの問題に直接関係していませんが、意味があるかもしれません:

//In a generic class, the compiler won't even allow you to instantiate 
//E with new

//If you try to do this:

 E obj1;
 obj1 = new E();  

 //You will see the compiler error that E is a type parameter and a CLASS 
 //has to be used with new, not a type parameter

実際の object: をジェネリック型がまだ必要なMyStaticClass.aList場所に配置しようとしています 。E

ジェネリック型でクラスを宣言したときはいつでも、ジェネリック型を持つと宣言されたそのクラスのメンバーの代わりに実際のクラス名を入れることができませんでした。私は常にパラメーター、変数、ETC を使用する必要がありました。そのクラスが定義した総称名 E を持つ。


Test私の経験では、ジェネリック E に基づくクラスのメンバー変数に代入するには、 classでジェネリック E に直接関連付けられている変数を使用する必要がありますTest。別のジェネリック クラスの別の "E" でさえ機能しません。他のジェネリック "E" は、Test クラスでジェネリックとして定義されているジェネリックと同じではないためです。

于 2012-12-17T22:25:13.397 に答える