[英]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的泛型教程應該能夠幫助您掌握它們。
您可能遇到的一個問題是,您從靜態函數中引用了成員變量,就像在leftHalf
中leftHalf
:
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
不擴展可比!
您擁有的兩種解決方案是
MyList.addEnd
或提出另一種更適合您班級需求的解決方案。
當我意識到您正在實施一個鏈接列表只是為了提高您的面試技巧(祝您好運!)時,我只想補充一下,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.