Java泛型方法的参数

5

我正在尝试理解Java泛型的整个主题。

更具体地说,是这个问题:

public class Node<E>{
    private E data;
    public Node(E data){
        this.data=data;
    }
    public E get(){
        return this.data;
    }
    public void set(E data){
        this.data=data;
    }
}

我该如何添加一个“extends”通配符,指定set方法可以接收E或任何继承自E的类(在这种情况下,节点将保存参数的向上转型版本)。
如果我保持原样,它是否仍然有效?
(我可能对泛型类型的不变方面有点困惑。)
谢谢!

3
它已经能够满足你想要的要求了。 - Oliver Charlesworth
我对这个问题进行了负评。如果你自己稍微做一点工作,它就很容易回答了。你甚至不需要谷歌,只需在任何Java IDE中使用ctrl-space即可自行查看。 - Dariusz
@Dariusz 你可以随意做任何你想做的事情。问题是,有时代码即使你不真正知道它为什么或如何工作,它也会“工作”。这就是为什么我在这里问的原因。 - Paz
4个回答

3

你的类已经可以满足你的需求了。下面我们举个例子来说明。假设你已经创建了一个Node(NumberIntegerLong等的超类);

Node<Number> numberNode = new Node<Number>(1);

您可以通过传递其子类来调用set方法。
numberNode.set(new Integer(1));
numberNode.set(new Long(1));

3
您声明了您的类 Node<E>,它已经接受了任何继承自 E 的类。

2
这与将集合作为泛型传递有什么不同吗?因为当我们编写 someMethod(ArrayList<E>) 时,只有类型为 E 的 ArrayLists 可以被传递。 - Prasad Kharkar
2
@PrasadKharkar 很好发现!是的,它们是不同的。 - johnchen902

0

如果你使用

public void set(E extends SomeType){
 this.data=data;
 }

那么您可以传递任何实现或扩展SomeType的对象。

请记住,SomeType在这里也可以是一个interface,即使它很奇怪,我们仍然需要编写E extends SomeType


0

或者你已经尝试过它是否有效了吗?

        final Node<Number> n =  new Node<Number>(new Integer(666));
        System.out.println(n.get());
        n.set(new Integer(777));
        System.out.println(n.get());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接