java 中的通用类型 - 对象类型不匹配

Generic type-Object type mismatch in java

我尝试创建一个 LinkedList class。但我有 2 个问题:

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

2) 在 get() 方法中,我想 return V 类型,如您所见,值变量已经是 V 类型。但它给了我 "cannot convert Object to 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;

    }

你举的这两个问题其实是一回事。鉴于您声明的参数化 class 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> 是文字——对 class 类型参数的引用,而不是任何具体类型。如果你这样做那么你的两个错误都会消失。

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

public class Node {

我看到的其他问题:

  • last=root; 似乎在任何构造函数、方法或初始化块之外。
  • 我没有看到 isEmpty() 方法,但为简洁起见,您可能没有发布它。
  • ifelse条件都不满足的情况下,get()方法需要一个return语句。