0

我有一个简单的问题。

我正在使用我自己定义的链接节点定义一个类,作为一个嵌套类。

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

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

    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 的方法 size() 未定义,这就是为什么我正在考虑将类定义更改为 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));

这可能是一个更好的选择吗?

谢谢!!

4

3 回答 3

1

有更好的方法来做到这一点!

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

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

Arraylist继承自Collection如下:
Collection-->AbstractList-->Arraylist

通过您的课程Collection代替泛型T

HNode<Collection> targetNode;

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

于 2013-03-30T21:23:42.537 回答
0

“我只想将此节点用于字符串的 ArrayLists 的节点,而不是用于泛型类型”

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

并创建一个类型的字段Arraylist<String>

于 2013-03-30T21:23:35.160 回答
0

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

HNode<T> 

HNode<List>

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

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

Edit: Also it looks like your last line is logically incorrect. remove() method returns result of operation (boolean), not the removed object itself. You need to get this element explicitly before removing, or just change you collection to LinkedList and call removeLast() method.

于 2013-03-30T21:34:20.990 回答