Java无法访问子类重新定义的方法中的顶级属性

时间:2012-12-20 14:49:19

标签: java generics inheritance

我的顶级课程中有以下内容像魅力一样:

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,但除了以下我不会遇到任何其他问题:{{1} }

编辑:我应该为TestA实现Iterator吗?

2 个答案:

答案 0 :(得分:10)

按照编码,“E”作为通用参数的两种用法是独立的并且是断开的。一个班级中的Vector<E>与另一个班级中的Vector<E>并不相同。

将子类声明更改为:

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

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

答案 1 :(得分:1)

您声明了Generic

class TestA<E> 

定义List&lt;类型的字段矢量&lt; E> &gt ;,表示向量将包含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>

重要的是将父类类型属性定义为将为子项定义的属性,因此您可以访问期望相同数据类型的列表字段。