我正在查看由节点组成的链表的示例实现。 set方法转到输入索引并将值设置为等于输入值。此外,它返回旧值。当他检索旧值时,他总是创建一个新的节点对象而不是类型为E的对象。这是必要的还是被认为是好的做法?还有任何效率方面的考虑吗?下面的示例代码
public E set(int idx, E newVal){
//looping code to get to the right node
//Assume variable finger is now a Node object that's at the right index
Node<E> temp = new Node<E>(finger);
finger.setValue(newVal);
return temp.getValue();
//Can I do the following instead?
E temp = finger.getValue();
finger.setValue(newVal);
return temp;
}
答案 0 :(得分:1)
不,使用泛型类型参数(在这种情况下为E
)是完全可以接受的。您的第二个代码示例没有任何问题。
我可以使用类型参数吗?
不,类型参数不是常规意义上的类型(不同于常规类型,例如非泛型类或接口)。
类型参数可用于键入(如非泛型类和接口)::
- 作为参数和返回方法类型
- 作为字段或本地参考变量的类型
- 作为其他参数化类型的类型参数
- 作为演员表中的目标类型
- 作为参数化方法的显式类型参数
类型参数不能用于以下目的(与非泛型类和接口不同)::
- 用于创建对象
- 用于创建数组
- 在异常处理中
- 在静态环境中
- 在instanceof表达式
中- as supertypes
- in class literal
答案 1 :(得分:1)
假设setValue()
和getValue()
修改相同的属性,前3行代码将返回newVal
(它们没有多大意义)
temp
是对finger
的引用,因此如果您为finger
中的某个属性设置了新值,那么它将在temp
中更改。
最后三行不具有相同的行为,因为它们返回先前的值。
答案 2 :(得分:0)
那个impl很奇怪。它可能是从C ++ impl翻译的
Node<E> temp = finger; // C++, copy constructor, default is shallow copy
finger.setValue(newVal);
return temp.getValue();
这对C ++来说非常便宜。