Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的泛型在定义方法时抛出错误_Java_Generics - Fatal编程技术网

Java中的泛型在定义方法时抛出错误

Java中的泛型在定义方法时抛出错误,java,generics,Java,Generics,我正在学习Java中的泛型。为此,我尝试了这样一个简单的LinkedList class Node { private int age; private String name; private Node next; public Node(int age, String name) { this.age = age; this.name = name; this.next = null; } public int getAge() {

我正在学习Java中的泛型。为此,我尝试了这样一个简单的LinkedList

class Node {
  private int age;
  private String name;
  private Node next;

  public Node(int age, String name) {
    this.age = age;
    this.name = name;
    this.next = null;
  }

  public int getAge() {
    return this.age;
  }

  public String getName() {
    return this.name;
  }

  public Node getNext() {
    return this.next;
  }

  public void setNext(Node next) {
    this.next = next;
  }
}

class LinkedList<T> {
  private T head;
  private T current;

  public LinkedList() {
    head = null;
    current = null;
  }

  public void append(T x) {
    if (head == null) {
      head = x;
      current = x;
    }
    else {
      current.setNext(x);
      current = x;
    }
  }

  public T getAt(int index) {
    T ptr = head;
    for(int i = 0; i < index; i++) {
      ptr = ptr.getNext();
    }
    return ptr;
  }
}

class Main {
  public static void main(String[] args) {
    LinkedList<Node> list = new LinkedList<Node>();
    list.append(new Node(39, "John"));
    list.append(new Node(43, "Josh"));
    Node x = list.getAt(1);
    System.out.println(String.format("%d, %s", x.getAge(), x.getName()));
  }
}

如果
current
的类型为
T
,则不能在
current
上调用
节点
类的方法(例如
setNext()
),因为在实例化
LinkedList
时,
T
可以被任何类替换

您的
节点
类不应是
链接列表
的泛型类型参数。链接列表应始终由节点组成。每个
节点中存储的数据类型应为通用类型

class Node<T> {
  private T data;
  private Node next;

  public Node(T data) {
    this.data = data;
    this.next = null;
  }
}

如果
current
的类型为
T
,则不能在
current
上调用
节点
类的方法(例如
setNext()
),因为在实例化
LinkedList
时,
T
可以被任何类替换

您的
节点
类不应是
链接列表
的泛型类型参数。链接列表应始终由节点组成。每个
节点中存储的数据类型应为通用类型

class Node<T> {
  private T data;
  private Node next;

  public Node(T data) {
    this.data = data;
    this.next = null;
  }
}
您必须创建
节点
链接列表

您必须创建
节点
链接列表


编译器无法理解T类型。您已经使用了
t.setNext()
,但是除非实际使用,否则它不会出现在t定义中。我在这里可能听起来有点困惑,但试试这个:

创建一个具有setNext和getNext方法的接口
Contract
。 实现节点在接口之上的扩展<代码>节点执行合同

在链表中将泛型更改为
T extends Contract
编译器无法理解T类型。您已经使用了
t.setNext()
,但是除非实际使用,否则它不会出现在t定义中。我在这里可能听起来有点困惑,但试试这个:

创建一个具有setNext和getNext方法的接口
Contract
。 实现节点在接口之上的扩展<代码>节点执行合同

在链表中,将泛型更改为
T extends Contract
对于任何给定的泛型
T
,都没有
hasNext
,因此代码不会编译

您必须确保LinkedList只保存节点类或其子类型

class LinkedList<T extends Node>
类链接列表
但是请注意:T与存储在节点中的泛型不同,因此这似乎更好

class LinkedList<T> {
    Node<T> head;
类链接列表{
节点头;

对于任何给定的泛型
T
,都没有
hasNext
,因此代码不会编译

您必须确保LinkedList只保存节点类或其子类型

class LinkedList<T extends Node>
类链接列表
但是请注意:T与存储在节点中的泛型不同,因此这似乎更好

class LinkedList<T> {
    Node<T> head;
类链接列表{
节点头;

private T current;
是一种泛型类型,您正在对其调用
setNext
getNext
。为什么
T
知道它总是有这些方法?这就是它不工作的原因

因此,您需要确保泛型类型T知道它有
setNext
getNext
方法

因此,解决方案是:


T在类定义中扩展了NodeAbstract
,其中NodeAbstract是声明这些方法签名的接口。现在,这确保了T得到的任何东西都将始终具有这两个方法。

private T current;
是泛型类型,您正在对其调用
setNext
getNext
T
知道它总是有这些方法吗?这就是它不起作用的原因

因此,您需要确保泛型类型T知道它有
setNext
getNext
方法

因此,解决方案是:


T在类定义中扩展了NodeAbstract
,其中NodeAbstract是声明这些方法签名的接口。现在这确保了T得到的任何东西都会有这两个方法。

好的,这当然是首选方法,但为什么我在代码中会出错?我看不出有什么错误。@metallicyo您试图在类型为泛型类型参数
T
的实例上调用
Node
类的方法。这是错误的。好的,这当然是首选方法,但为什么我在该代码中仍然会出错?我看不出有什么错误。@metallicprest您试图在类型为泛型类型参数
T
的实例上调用
Node
类的方法se type是泛型类型参数
T
。这是错误的。