java中的泛型类型 - 对象类型不匹配

时间:2015-01-08 20:33:25

标签: java generics linked-list declaration type-mismatch

我尝试创建一个LinkedList类。但我有两个问题:

1)Node last=null声明给出了一个原始类型错误,但在该声明的上方没有类似的错误。 4个相同的声明但只有最后一个发出错误。

2)在get()方法中我想返回V类型,你可以看到值变量已经是V类型。但它给了我“无法将对象转换为V”的错误。但是temp.value已经是V。

public class Linkedlist<V> {

    public class Node <V> {

        private Node next=null;

        private String key;

        private int size;

        private V value=null;

        public Node(V value, String key){
            this.key=key;
            this.value=value;
        }
    }

    Node root=null;
    Node temp=null;
    Node temp1=null;
    Node last=null;

    last=root;

    public void add(V value, String key){
        last.next = new Node(value,key);
        last=last.next;
    }


    public void remove(String key){
        temp=root;
        if(isEmpty())
        System.out.println("list is empty!");

        else{
            if(temp.next!=null){

                if(!temp.next.key.equals(key)){
                    remove(temp.next.key);
                }

                else if(temp.next.key.equals(key)){
                    if(temp.next==last)
                    last=temp;
                    temp.next=temp.next.next;
                }
            }
            else
            System.out.println("there is no such element");
        }
    }


    public V get(String key){
        temp=root;

        if(temp.key.equals(key)){
            if(temp.next!=null)
            get(temp.next.key);

            else
            return null;
        }
        else if(temp.key.equals(key))
        return temp.value;

    }

2 个答案:

答案 0 :(得分:0)

你引用的两个问题实际上是同一个问题。给定一个参数化类Node<V>,例如你声明的那些......

Node root=null;
Node temp=null;
Node temp1=null;
Node last=null;

...所有声明原始类型Node的对象。其他代码将解释为将它们的类型参数指定为Object。你应该这样声明它们:

Node<V> root=null;
Node<V> temp=null;
Node<V> temp1=null;
Node<V> last=null;

其中<V>是文字的 - 对类的类型参数的引用,而不是任何具体类型。如果你这样做,那么你的错误都会消失。

答案 1 :(得分:0)

您的内部课程Node是通用的,但您正在使用该课程的原始形式。这意味着返回V的方法会被类型擦除,现在它返回Object。但是Node类不需要是通用的。非static嵌套类(即嵌套类)可以使用其封闭类的泛型类型参数。因此,请删除<V>类定义上的Node

public class Node {

我看到的其他问题:

  • last=root;似乎在任何构造函数,方法或初始化块之外。
  • 我没有看到isEmpty()方法,但为了简洁起见,您可能还没有发布。
  • 如果get()return条件都不满足,则if方法需要else语句。