我有两种扩展通用ArrayList类型的类型。
public class BuyersGuideResponse extends ArrayList<BuyersGuideItem>
{
private void checkStatusAttributes(){ ... }
private void addItems(){ ... }
}
public class CatalogEngineTypeResponse extends ArrayList<CatalogEngineType>
{
private void checkStatusAttributes(){ ... }
private void addItems(){ ... }
}
checkStatusAttributes方法在两种类型中都是相同的,所以我想创建一个抽象的通用中间类型。我目前有
public class ArrayListResponse extends ArrayList<Object>
{
// no implementation
}
public class BuyersGuideResponse<BuyersGuideItem> extends ArrayListResponse
{
// implementation unchanged
...
private void addItems()
{
NodeList nodes = doc.getElementsByTagName(CatalogConst.BUYERS_GUIDE_ITEM_NODE_NAME);
for(int i = 0; i < nodes.getLength(); i++)
{
add(new BuyersGuideItem(nodes.item(i)));
}
...
}
...
}
编译时会生成以下错误:
BuyersGuideResponse.java:51: error: unexpected type
add(new BuyersGuideItem(nodes.item(i)));
^
required: class
found: type parameter BuyersGuideItem
where BuyersGuideItem is a type-variable
BuyersGuideItem extends Object declared in BuyersGuideItem.java
我哪里错了?
答案 0 :(得分:4)
此声明
public class BuyersGuideResponse<BuyersGuideItem> extends ArrayListResponse
相当于
public class BuyersGuideResponse<T> extends ArrayListResponse
所以你可以看到为什么那不起作用。它会尝试做
add(new T(nodes.item(i)));
type参数遮蔽了类型的名称。
我会做以下
public class ArrayListResponse<T> extends ArrayList<T>
为您的父类。
public class BuyersGuideResponse extends ArrayListResponse<BuyersGuideItem>
为您的孩子实施。这里BuyersGuideItem
是一个类型参数,不会隐藏类型名称。