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()
方法,但为简洁起见,您可能没有发布它。
- 在
if
和else
条件都不满足的情况下,get()
方法需要一个return
语句。
我尝试创建一个 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()
方法,但为简洁起见,您可能没有发布它。 - 在
if
和else
条件都不满足的情况下,get()
方法需要一个return
语句。