5

私のトップクラスには、チャームのように機能する次のものがあります。

public class TestA<E extends Test>
{
      List<Vector<E>> list;
      String name, location;

      TestA(String name, String location)
      {
            this.name = name;
            this.location = location;
            list = new ArrayList<Vector<E>>();
      }

      void populate(Test[] arr)
      {
            for(Vector<E> vk : list)
            {
                  // Code here...
            }
      }

}     

class OrderedTest<E extends Test> extends TestA {

      OrderedTest(String name, String location)
      {
            super(name, location);
      }

      void populate(Test[] arr)
      {
            for(Vector<E> vk : list) // ERROR: Cannot convert from element Object to Vector<E>
            {
                  // Code here... 
            }
      }

}

サブクラスでpopulate()を拡張しようとすると、基本的にここでのみ同じメソッドが必要になるため、順序付けされたものが必要なので、クイックソートメソッドで各ベクターをプルしますが、他の問題は発生しません。// ERROR: Cannot convert from element Object to

編集:TestA用のイテレータを実装する必要がありますか?

4

2 に答える 2

10

コード化されているように、ジェネリック パラメーターとしての "E" の 2 つの使用法は独立しており、切り離されています。Vector<E>あるクラスでは、他のクラスと同じ意味ではありませんVector<E>

サブクラス宣言を次のように変更します。

class OrderedTest<E extends Test> extends TestA<E>

スーパークラス宣言の E は、OrderedTest と同じ E です。

于 2012-12-20T14:54:42.303 に答える
1

ジェネリックを宣言しました

class TestA<E> 

List< Vector< E > > 型のフィールドを定義すると、ベクターに E 型の要素が含まれることになります。これは、E を定義しない場合、サブクラス化 TestA のインスタンス化時にベクターがベクターになることも意味します。

ジェネリックでもある子クラスは、次のように定義されます。

class OrderedTest<E extends Test> extends TestA

文字「E」を再利用してこのジェネリックを定義しても、親クラスにバインドされません。つまり、親クラス E 型を定義していないということであり、それが Object (既定の型) である理由です。

親クラスのジェネリック型を子クラスと同じになるように定義する場合は、次のように定義する必要があります。

class OrderedTest<E extends Test> extends TestA<E>

ここで文字 'E' は親の 'E' パラメータとは関係がなく、クラス OrderedTest のパラメータであるため、任意の文字にすることができることに注意してください。この型パラメータを使用して、父型パラメータも。したがって、たとえば次のことができます。

class OrderedTest<T extends Test> extends TestA<T>

重要なことは、子に定義されるもので親クラスの型プロパティを定義することです。これにより、同じデータ型を期待してリスト フィールドにアクセスできます。

于 2012-12-20T15:01:37.670 に答える