首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型setter方法不兼容类型错误

泛型setter方法不兼容类型错误
EN

Stack Overflow用户
提问于 2018-10-11 02:59:15
回答 2查看 359关注 0票数 1

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

代码语言:javascript
复制
.\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#1 (新数据)覆盖T#1类型(先前的数据)吗?下面是带有构造函数和setter方法的类:

代码语言:javascript
复制
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;
  }

  //...

}

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

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

代码语言:javascript
复制
.\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;
        ^
  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:82: error: method setNext in class SinglyLinkedNode<T#2> cannot be applied to given types;
        prev.setNext() = curr.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

因此,在我看来,getNext() (来自SinglyLinkedNode)和head (来自SinglyLinkedList)似乎没有返回任何值,尽管它们都应该返回SinglyLinkedNode对象。

这是有问题的代码。我已经标明了错误产生的地方。

代码语言:javascript
复制
public class SinglyLinkedList<T> {
  private int size;
  private SinglyLinkedNode<T> head;
  private SinglyLinkedNode<T> tail;

  SinglyLinkedList() {
    this.size = 0;
    this.head = null;
    this.tail = null;
  }

  //...

  public SinglyLinkedNode<T> remove(int i) {
    SinglyLinkedNode<T> curr = this.head;
    for(int counter = 0; counter < i; counter++) {
      curr = curr.getNext();               //<---------------
    }
    SinglyLinkedNode<T> toBeRemoved = curr.getNext();
    curr.setNext() = toBeRemoved.getNext();
    this.size--;
    return toBeRemoved;
  }

  //...

  public SinglyLinkedNode<T> remove(T d) {
    if(this.head == null) {
      return null;
    }
    if(this.head.getData() == d) {
      SinglyLinkedNode<T> toBeRemoved = this.head;
      this.head = this.head.getNext();
      return toBeRemoved;
    }
    SinglyLinkedNode<T> curr = this.head;
    SinglyLinkedNode<T> prev = null;
    prev.setNext() = this.head;           //<---------------
    while(curr.getNext() != null) {
      if(curr.getData() == d) {
        prev.setNext() = curr.getNext();  //<---------------
        return curr;
      }
    }
    return null;
  }

  //...

如果还有人看到这篇文章,我会很感激他们能帮我做这件事。再次感谢!

编辑:我也修复了这个错误,它是

代码语言:javascript
复制
curr.setNext(toBeRemoved.getNext());

代码语言:javascript
复制
curr.setNext() = toBeRemoved.getNext()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-11 03:14:07

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

代码语言:javascript
复制
public <T> void setData(T d) {
this.data = d;
}

public <T> void setNext(SinglyLinkedNode<T> n) {
    this.next = n;
}

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-10-11 03:09:47

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

代码语言:javascript
复制
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实例并将值设置为:

代码语言:javascript
复制
public static void main(String[] args) {
    SinglyLinkedNode<Integer> integers = new SinglyLinkedNode<>(2);
    // 
}

另外,由于我已经有了一个设置值的构造函数,所以我会去掉setter。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52751503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档