我有一个简单的问题。
我正在使用我自己定义的链接节点定义一个类,作为一个嵌套类。
我只想把这个Node用于String类型的ArrayLists,而不是泛型类型。
我为泛型T定义了Node,即HNode
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类中。
它不断给出警告,方法size()是未定义的类型T,这就是为什么我正在考虑改变类的定义为Node的ArrayList of String。
(第一个问题是:)这是正确的方法吗?还是有更好的方法?或者只要使用
就可以忽略警告另一个问题是。我声明了变量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));
这可能是一个更好的选择吗?
谢谢! !
有更好的方法!
由于您希望使用Arraylist
的.size()
方法,我建议将您的节点(和包含类)设置为Collection
接口的类型。
Collection
接口保证对象将实现.size()
方法,这将消除编译错误。
Arraylist
继承自Collection
:Collection
-->
AbstractList
-->
Arraylist
在你的类中使用Collection
代替通用的T
:
HNode<Collection> targetNode;
这将允许你的类处理所有实现Collection
接口的类,这是一个广泛的类组。这保持了你的抽象,大大增加了代码的可重用性,而不是只将整个类提交到Arraylist
"我只想使用这个节点的节点数组列表的字符串,而不是一个泛型类型"
然后像这样创建你的类型,删除泛型,使用:HNode代替HNode<T>
创建一个类型为Arraylist<String>
的字段。
为了能够使用List接口的方法,您只需要替换
HNode<T>
HNode<List>
出现"targetNode需要被分配"的警告,因为如果n=0, for循环将不会被执行。这就是为什么targetNode可能没有被分配。这就是为什么你应该添加范围检查或者你可能会在这一行得到NullPointerException
targetNode._datum.add(this._datum.remove(this._datum.size()-1));
编辑:看起来你的最后一行在逻辑上是不正确的。Remove()方法返回操作的结果(布尔值),而不是被删除的对象本身。您需要在删除之前显式地获取此元素,或者只需将集合更改为LinkedList并调用removeLast()方法。