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() 时,我基本上只需要在这里使用相同的方法,我想要订购的东西,所以我将在快速排序方法中提取每个 Vector,但除了以下问题之外我没有遇到任何其他问题:// ERROR: Cannot convert from element Object to

编辑:我应该为 TestA 实现迭代器吗?

4

2 回答 2

10

如编码所示,“E”作为通用参数的两种用法是独立且不连贯的。Vector<E>在一类中并不意味着与另一类中的相同Vector<E>

将子类声明更改为:

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

并且超类声明中的 E 与 OrderedTest 中的 E 相同。

于 2012-12-20T14:54:42.303 回答
1

你声明了一个 Generic

class TestA<E> 

定义 List< Vector< E >> > 类型的字段,意味着向量将包含 E 类型的元素,这也意味着如果不定义 E,则在子类化 TestA 的实例化时,Vector 将是 Vector。

子类也是泛型定义为:

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 回答