从通用ArrayList派生泛型类型

时间:2013-09-12 15:21:11

标签: java generics arraylist

我有两种扩展通用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

我哪里错了?

1 个答案:

答案 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是一个类型参数,不会隐藏类型名称。