问题描述
||
我正在看一个由节点组成的链表的示例实现。 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;
}
解决方法
不,使用通用类型参数(在这种情况下为ѭ1)是完全可以接受的。您的第二个代码示例没有错。
根据泛型常见问题解答:
我可以使用类型参数吗?
不,类型参数不是常规意义上的类型(不同于常规类型,例如非泛型类或接口)。
类型参数可用于键入(例如非泛型类和接口):
作为参数和方法的返回类型
作为字段或局部引用变量的类型
作为其他参数化类型的类型参数
作为演员的目标类型
作为参数化方法的显式类型参数
类型参数不能用于以下目的(不同于非通用类和接口):
用于创建对象
用于创建数组
在异常处理中
在静态环境中
在表达式的实例中
作为超类型
用类字面量
, 假设
setValue()
和getValue()
修改了相同的属性,则代码的前三行将返回newVal
(它们没有多大意义)
temp
是对ѭ6reference的引用,因此,如果在finger
中为属性设置新值,则它将在temp
中更改。
最后三行的行为不同,因为它们返回了先前的值。
, 该印象非常奇怪。它可能是从C ++ impl翻译而来的
Node<E> temp = finger; // C++,copy constructor,default is shallow copy
finger.setValue(newVal);
return temp.getValue();
对于C ++而言,这将是非常便宜的。