实现特定类的LinkedList,而不是泛型类型

时间:2013-03-30 21:13:42

标签: java generics data-structures linked-list

我有一个简单的问题。

我使用我自己定义的链接Node定义一个类,作为嵌套类。

我只想将此节点用于String的ArrayLists节点,而不是泛型类型。

我将节点定义为泛型类型T,即HNode< T>,但我想在此Node类上添加使用ArrayList方法的方法。例如,

    public void forward(int n) { //return boolean??
        HNode<T> targetNode;
        for(int i=0; i<n; i++) {
            targetNode = this._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));
    }

在我的Node类中。

它一直警告说类型T的方法大小()是未定义的,这就是为什么我正在考虑将类定义更改为String的ArrayList节点。

(第一个问题是:) 这是正确的方法,还是有更好的方法吗? 或者,只要我使用

,我就可以忽略警告

另一个问题是这个。 我声明了变量targetNode,并在for循环中分配了它。 但是,它会抛出一个警告,指出需要分配targetNode。

    public void forward(int n) { //return boolean??
        HNode<T> targetNode = this;
        for(int i=0; i<n; i++) {
            targetNode = targetNode._next;
        }
        targetNode._datum.add(this._datum.remove(this._datum.size()-1));

这可能是更好的选择吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

有更好的方法!

由于您希望使用.size()Arraylist方法,我建议您将节点(以及包含类)设置为Collection接口的类型。

Collection接口保证对象将实现.size()方法,这将消除您的编译错误。

Arraylist继承自Collection,具体如下:
Collection --> AbstractList --> Arraylist

在您的班级中使用Collection代替通用T

HNode<Collection> targetNode;

这将允许您的类处理实现Collection接口的所有类,这是一组广泛的类。这样可以维护您的抽象并显着提高代码的可重用性,然后将整个类只提交到Arraylist

答案 1 :(得分:0)

&#34;我只想将此Node用于String的ArrayLists节点,而不是泛型类型&#34;

然后创建你的类型,删除泛型,使用:HNode而不是HNode<T>

创建Arraylist<String>类型的字段。

答案 2 :(得分:0)

为了能够使用List接口的方法,您只需要替换

HNode<T> 

HNode<List>

出现警告“targetNode需要分配”,因为如果n = 0,则不会执行for循环。这就是为什么不能分配targetNode。这就是为什么你要添加范围检查,或者你可能会在这一行得到NullPointerException

targetNode._datum.add(this._datum.remove(this._datum.size()-1));

编辑:此外,您的最后一行似乎在逻辑上不正确。 remove()方法返回操作结果(boolean),而不是删除的对象本身。您需要在删除之前显式获取此元素,或者只是将集合更改为LinkedList并调用removeLast()方法。