簡體   English   中英

Java通用參數

[英]Java generic arguments

回到這里,對我的基本ADT內容進行修改以進行采訪,並嘗試通過在學習Java的同時用一塊石頭殺死兩只鳥。 嘗試使用通用鏈表(我正在創建自己)編寫用於合並排序的簡單算法。 事實證明,這比我最初想象的要困難得多! 有人可以幫我嗎? 我將開始研究基礎知識,並隨着我的深入而更新本帖子。

我的通用鏈表代碼如下:

 public class NodeList<T extends Comparable<T> > {
  private T head;
  public NodeList<T> tail;
  public NodeList( T item, NodeList<T> list ) {
    head = item;
    tail = list;
  } 

}

我試圖在我創建的另一個類中訪問該類,如下所示:

    public class MyList<T extends Comparable<T>> {

  private NodeList<T> nodes;
  private static int size;
  public MyList( ) { 
    nodes = null; 
  }

  public MyList(T[] array ){
    for( T item : array ) {
      nodes = new NodeList<T>(item, nodes); 
    }
    size = array.length;
  }


  public void add( T item ) { 
    nodes = new NodeList<T>( item, nodes ); 
    size++;
  }


  public void addEnd( T item ) {
    NodeList<T> temp = nodes;
    while ( temp == null || temp.tail != null) {
      temp = temp.tail;
    }
    size++;
    temp.tail = new NodeList<T> ( item, null);
  }

我相信到目前為止,在add和addEnd方法之前,所有事情都是正確的,應該分別將泛型添加到列表的開頭和列表的結尾。

我的代碼繼續:

 public static <S extends Comparable<S>>
    MyList<S> sort( MyList<S> list ) {

    if ( size > 1 ) {

      MyList<S> left  = leftHalf( list );
      MyList<S> right = rightHalf( list );
      list = merge( left, right );
    }

    return list;
  }

  private static <S extends Comparable<S>>
    MyList<S> merge( MyList<S> left, MyList<S> right ) {

  }

  private static <S extends Comparable<S>>
    MyList<S> leftHalf( MyList<S> list ) {
    MyList <S> leftSide = new MyList();
    int middle;
    if(size % 2 == 1) {
     middle = size +1;
    } else {
     middle = size; 
    }
    for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
      leftSide.addEnd(nodes);
    }


    // return elements from 0 .. list.size() / 2
  }

我得到了錯誤:

MyList中的addEnd(S)無法應用於(NodeList)

當我跑步時發生

leftSide.addEnd(nodes);

有人能看到原因/告訴我在目前為止的工作中我是否正確嗎? 再次非常感謝!

如果希望NodeList和MyList僅包含Comparable項,則可以將通用參數T替換為以下內容:

public class NodeList<T extends Comparable> {

要么

public class NodeList<T extends Comparable<T>> {

並在使用Comparable地方替換T 這樣,您知道T至少實現了Comparable的方法。

Oracle的泛型教程應該能夠幫助您掌握它們。


您可能遇到的一個問題是,您從靜態函數中引用了成員變量,就像在leftHalfleftHalf

   for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
      leftSide.addEnd(nodes);
    }

nodes是成員變量,即非靜態變量,因此您不能從靜態方法中調用它。 對於該示例,您必須從傳遞的MyList獲取它:

   for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
      leftSide.addEnd(list.nodes);
    }

其他嘗試使用成員變量的靜態方法也是如此。


同樣,出現錯誤的原因是: addEnd(S) in MyList<S> cannot be applied to (NodeList<T>)是因為根據您的類型參數, S是可比較的。 NodeList不擴展可比!

您擁有的兩種解決方案是

  1. 使NodeList擴展為可比較,以便可以將其傳遞到MyList.addEnd
  2. 對采用NodeList的addEnd進行重載(即,使用相同名稱的其他方法),並將傳遞的NodeList中的所有項添加到MyList中。

或提出另一種更適合您班級需求的解決方案。


當我意識到您正在實施一個鏈接列表只是為了提高您的面試技巧(祝您好運!)時,我只想補充一下,Java中已經有一個通用的LinkedList

您為什么兩次發表幾乎相同的問題? 您可以擴展您的問題,添加評論等。

我們已經給您了這個提示 :)

發生錯誤是因為類NodeList沒有接收通用T類和NodeList的構造函數。 實際上,此實現將替換節點在每個循環上引用的引用對象。 您還應該解決該問題。

您應該做的就是讓T成為可比較對象,並更改屬性,例如:

public class NodeList<T extends Comparable> {
    private T head;
    private NodeList tail;
    public NodeList( T item, NodeList list ) {
        head = item;
        tail = list;
    }
}

如果您告訴我們代碼的確切用途會更好。

暫無
暫無

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

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