我的顶级课程中有以下内容像魅力一样:
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吗?
答案 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>
重要的是将父类类型属性定义为将为子项定义的属性,因此您可以访问期望相同数据类型的列表字段。