我有一个简单的问题。
我使用我自己定义的链接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));
这可能是更好的选择吗?
谢谢!
答案 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()方法。