与泛型不兼容的类型



我不熟悉泛型,所以在这个方法中,我试图从头开始实现一个remove方法,:

public class LinkedList<T> implements LinkedListInterface<T> {
private Node head;
private Node tail;
private int count;
public LinkedList () {
head = null;
tail = null;
count = 0;
}
class Node {
T data;
Node next;

Node(T data) {
this.data = data;
next = null;
}
}
public Node getHead() {
return head;
}
public T remove(int pos) throws ListException {
if (pos < 1 || pos > count) {
throw new ListException("Invalid position to remove from");
}
Node removedItem = null;
if (count == 1) {
removedItem = head;
head = null;
tail = null;
}
else if (pos == 1) {
removedItem = head;
head = head.next;
}
else if (pos == count) {
removedItem = tail;
Node prev = jump(pos - 2);
prev.next = null;
tail = prev;
}
else {
Node prev = jump(pos - 2);
removedItem = prev.next;
prev.next = prev.next.next;
}
count--;
return removedItem; // error: incompatible types: LinkedList<T>.Node cannot be converted to T
}
}

我需要帮助确定这个"T"在删除方法中到底是什么,这个错误消息意味着什么,以及我应该做些什么来修复它,感谢的帮助

Generics(或者更确切地说,正确的名称"类型变量"(是链接事物的一种方式。

所有的Ts代表一种类型。提到T的每一个地方,它对一个事物的任何给定"用法"都是相同的类型,但你不知道T是什么。它可以是数字,可以是字符串,也可以是你从未听说过的某件事。但它是某种类型的。如果你知道的话,你就把它写出来。

在您的片段中,public LinkedList<T>声明类型变量(就像在开始使用x作为可以容纳的变量之前需要键入int x;一样,您需要声明类型变量,这就是它的声明位置。T没有限制-它可以是任何类型(除了基元,因为基元类型和泛型根本不混合,至少目前是这样——也许未来的java版本会改变这一点(。

在整个文件中出现的所有其他T都只是它的简单用法。

换句话说,你的代码说:对于任何特定的LinkedList,它都有一些类型与之相关。我们不知道它是什么,但每个实例都有这样的东西。

泛型完全是编译时的事务,所以当你运行代码时,这没有任何影响,编译器只需要来帮助你并将事情联系在一起。练习的目的只是让你告诉编译器,在不同的地方使用的各种类型是未知的,但我们知道,它们是相同的。

因此,给定LinkedList的任何特定实例,其remove方法返回与其add方法接收的类型相同的。其类型与其内部Node内部类的data字段相同。

这能给你带来什么?编译时间检查就是其中之一。编译器现在可以为您查找错误。事实的确如此!您的意图显然是让remove方法返回它删除的东西,但您并没有这么做。实际上,您正在返回包含已删除内容的节点对象。这个节点对象甚至不公开可见(您的Node内部类具有包私有访问权限(,显然返回它完全没有用,而且根据您的签名,您不是有意的。

要修复您的错误,只需编写return removedItem.data;即可。

最新更新