声明类型为E的变量(泛型)是不好的

时间:2011-06-14 22:25:28

标签: java generics

我正在查看由节点组成的链表的示例实现。 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;

 } 

3 个答案:

答案 0 :(得分:1)

不,使用泛型类型参数(在这种情况下为E)是完全可以接受的。您的第二个代码示例没有任何问题。

根据the Generics FAQ

  

我可以使用类型参数吗?

     

不,类型参数不是常规意义上的类型(不同于常规类型,例如非泛型类或接口)。

     

类型参数可用于键入(如非泛型类和接口)::

     
      
  • 作为参数和返回方法类型
  •   
  • 作为字段或本地参考变量的类型
  •   
  • 作为其他参数化类型的类型参数
  •   
  • 作为演员表中的目标类型
  •   
  • 作为参数化方法的显式类型参数
  •   
     

类型参数不能用于以下目的(与非泛型类和接口不同)::

     
      
  • 用于创建对象
  •   
  • 用于创建数组
  •   
  • 在异常处理中
  •   
  • 在静态环境中
  •   
  • 在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 ++来说非常便宜。