为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2021-11-11 14:13:35
我是泛型的新手,我正在尝试使用泛型类 SinglyLinkedNode 实现链表。但是,当我运行 setData() 和 setNext() 方法时,出现以下错误:.\singlyLinkedList\SinglyLinkedNode.java:13: error: incompatible types: T#1 cannot be converted to T#2this.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 对象。
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

你面临的问题其实很简单。基本上,您需要了解泛型方法完全独立于泛型类。


public <T> void setData(T d) {

this.data = d;

}


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

    this.next = n;

}

当您<T>在方法的修饰符中放置 a 时,您将使其成为通用方法。你的泛型方法中的类型 T 是不同的,并且覆盖了整个类的类型 T,这意味着你可以输入任何类型的对象,该方法将使用它作为其局部 T 值,这可以与全局完全不同类型 T。


<T>从您的方法修饰符中删除将使它们成为常规的 setter 方法并默认为类类型 T,它保证与所需的类型匹配。


查看完整回答
反对 回复 2021-11-11
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您不需要在 setter 上使用泛型,因为它将处理与类正在处理的相同类型的数据。所以,你的代码会是这样的:


public class SinglyLinkedNode<T> {

    private T data;

    private SinglyLinkedNode<T> next;


    SinglyLinkedNode(T d) {

        this.data = d;

        this.next = null;

    }


    public void setData(T d) {

        this.data = d;

    }


    //...


    public void setNext(SinglyLinkedNode<T> n) {

        this.next = n;

    }


    //...


}

所以现在您可以创建 SinglyLinkedNode 的实例并将值设置为:


public static void main(String[] args) {

    SinglyLinkedNode<Integer> integers = new SinglyLinkedNode<>(2);

    // 

}

另外,我会摆脱 setter,因为我已经有一个构造函数来设置值。


查看完整回答
反对 回复 2021-11-11
  • 2 回答
  • 0 关注
  • 217 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信