簡體   English   中英

通用設置方法不兼容的類型錯誤

[英]Generic setter method incompatible type error

我是泛型的新手,我正在嘗試使用泛型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(現有數據)的類型? 這是帶有構造函數和設置方法的類:

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;
        ^
  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對象也是如此。

這是有問題的代碼。 我已標記出錯誤發生的位置。

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;
  }

  //...

如果仍然有人遇到這篇文章,如果他們能幫助我,我將不勝感激。 再次感謝!

編輯:我也修復此錯誤; 它的

curr.setNext(toBeRemoved.getNext());

curr.setNext() = toBeRemoved.getNext()

您面臨的問題實際上非常簡單。 基本上,您需要了解泛型方法完全獨立於泛型類

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,該類型必須保證與所需類型匹配。

您不需要在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);
    // 
}

另外,由於我已經有一個設置值的構造函數,因此我將擺脫設置方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM