通用 setter 方法不兼容的类型错误

我是泛型的新手,我正在尝试使用泛型类 SinglyLinkedNode 实现链表。但是,当我运行 setData() 和 setNext() 方法时,出现以下错误:


.\singlyLinkedList\SinglyLinkedNode.java:13: error: incompatible types: T#1 cannot be 

converted to T#2

this.data = d;

            ^

where T#1,T#2 are type-variables:

  T#1 extends Object declared in method <T#1>setData(T#1)

  T#2 extends Object declared in class SinglyLinkedNode

.\singlyLinkedList\SinglyLinkedNode.java:21: error: incompatible types: 

SinglyLinkedNode<T#1> cannot be converted to SinglyLinkedNode<T#2>

this.next = n;

            ^

where T#1,T#2 are type-variables:

  T#1 extends Object declared in method <T#1>setNext(SinglyLinkedNode<T#1>)

  T#2 extends Object declared in class SinglyLinkedNode

在我看来,抛出错误是因为存在一种潜在的场景,其中预先存在的 this.data 或 this.next 的类型与 d 或 n 不匹配。我怎样才能解决这个问题?有什么方法可以用 T#2(新数据)覆盖 T#1(预先存在的数据)的类型?这是带有我的构造函数和 setter 方法的类:


public class SinglyLinkedNode<T> {

  private T data;

  private SinglyLinkedNode<T> next;


  SinglyLinkedNode(T d) {

    this.data = d;

    this.next = null;

  }


  public <T> void setData(T d) {

    this.data = d;

  }


  //...


  public <T> void setNext(SinglyLinkedNode<T> n) {

    this.next = n;

  }


  //...


}

我很感激你能提供的任何帮助。提前致谢!


编辑:感谢您的帮助!我已经从我的方法中删除了,但是当我从我的 SinglyLinkedList 类运行 setNext() 时我仍然收到以下错误:


.\singlyLinkedList\SinglyLinkedList.java:63: error: method setNext in class SinglyLinkedNode<T#2> cannot be applied to given types;

    curr.setNext() = toBeRemoved.getNext();

        ^

  required: SinglyLinkedNode<T#1>

  found: no arguments

  reason: actual and formal argument lists differ in length

  where T#1,T#2 are type-variables:

    T#1 extends Object declared in class SinglyLinkedList

    T#2 extends Object declared in class SinglyLinkedNode

.\singlyLinkedList\SinglyLinkedList.java:79: error: method setNext in class SinglyLinkedNode<T#2> cannot be applied to given types;

    prev.setNext() = this.head;

        ^

所以在看来,getNext()(来自 SinglyLinkedNode)和 head(来自 SinglyLinkedList)没有返回任何值,即使它们都应该返回 SinglyLinkedNode 对象。


一只萌萌小番薯
浏览 208回答 2
2回答

侃侃尔雅

你面临的问题其实很简单。基本上,您需要了解泛型方法完全独立于泛型类。public <T> void setData(T d) {this.data = d;}public <T> void setNext(SinglyLinkedNode<T> n) {&nbsp; &nbsp; this.next = n;}当您<T>在方法的修饰符中放置 a 时,您将使其成为通用方法。你的泛型方法中的类型 T 是不同的,并且覆盖了整个类的类型 T,这意味着你可以输入任何类型的对象,该方法将使用它作为其局部 T 值,这可以与全局完全不同类型 T。<T>从您的方法修饰符中删除将使它们成为常规的 setter 方法并默认为类类型 T,它保证与所需的类型匹配。

陪伴而非守候

您不需要在 setter 上使用泛型,因为它将处理与类正在处理的相同类型的数据。所以,你的代码会是这样的:public class SinglyLinkedNode<T> {&nbsp; &nbsp; private T data;&nbsp; &nbsp; private SinglyLinkedNode<T> next;&nbsp; &nbsp; SinglyLinkedNode(T d) {&nbsp; &nbsp; &nbsp; &nbsp; this.data = d;&nbsp; &nbsp; &nbsp; &nbsp; this.next = null;&nbsp; &nbsp; }&nbsp; &nbsp; public void setData(T d) {&nbsp; &nbsp; &nbsp; &nbsp; this.data = d;&nbsp; &nbsp; }&nbsp; &nbsp; //...&nbsp; &nbsp; public void setNext(SinglyLinkedNode<T> n) {&nbsp; &nbsp; &nbsp; &nbsp; this.next = n;&nbsp; &nbsp; }&nbsp; &nbsp; //...}所以现在您可以创建 SinglyLinkedNode 的实例并将值设置为:public static void main(String[] args) {&nbsp; &nbsp; SinglyLinkedNode<Integer> integers = new SinglyLinkedNode<>(2);&nbsp; &nbsp; //&nbsp;}另外,我会摆脱 setter,因为我已经有一个构造函数来设置值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java