java不好声明类型E泛型的变量

问题描述

|| 我正在看一个由节点组成的链表的示例实现。 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 ++而言,这将是非常便宜的。