2016-05-01 100 views
0

我有以下java類,它具有一個實例變量屬性作爲聲明類時傳遞的泛型類型。傳遞一個泛型類型對象作爲方法參數的Java

當我嘗試分配傳遞它作爲方法參數的屬性時,如果我更改參數本身的值,它似乎不會更改其值。

代碼:

public class BST<T extends Comparable<T>, S>{ 
    private Node<T, S> bstRoot; 

    public Node<T,S> getRoot() { 
     return bstRoot; 
    } 
    public void setRoot(Node<T,S> root) { 
     this.bstRoot = root; 
    } 
    public boolean put(T key, S value){ 
     Node<T,S> node = new Node<T,S>(key, value); 
     return put(node, bstRoot); 
    } 
    private boolean put(Node<T,S> node, Node<T,S> root){ 
     if(root == null){ 
      root = node; 
     } 
     else{ 
      if(root.compareTo(node) < 0){ 
       put(node, root.getRightChild()); 
      } 
      else{ 
       put(node, root.getLeftChild()); 
      } 
     } 
     return true; 
    } 
} 

當我做到以下幾點:

public class BSTTest { 
    public static void main(String[] args){ 
     BST<Integer, String> bst = new BST<Integer, String>(); 
     bst.put(10, "Hello10"); 
    } 
} 

做放後,bstRoot仍然是空,而不是被設置爲Node對象與主要值10和值Hello10。那麼它是不是通過引用傳遞?

+1

我在您發佈的代碼中看不到'BST'構造函數。 – Eran

回答

2

這看起來不正確:

if(root == null){ 
    root = node; 
} 

爲什麼? root是您的方法中定義的變量。 It doesn't have the same lifecycle作爲您實例中的字段。

private boolean put(Node<T,S> node, Node<T,S> root) 

在這裏爲空樹實際使用bstRoot會更可靠。

if(bstRoot == null){ 
    bstRoot = node; 
} 
+0

儘管其他答案解釋了問題所在,但鏈接解釋了原因。 – as3rdaccount

5

問題是以下幾點。在你的第一個put方法,你這樣做:

return put(node, bstRoot); 

你的第二個put方法是這樣的:

private boolean put(Node<T,S> node, Node<T,S> root){ 
    if(root == null){ 
     root = node; 
    } 

所以,在第一put方法傳遞bstRootroot參數第二put方法。

您似乎期望bstRoot通過引用傳遞,以便第二個put方法將設置bstRoot

事實並非如此。在Java中,一切通過值。因此,第二種方法中的rootbstRoot的副本,修改root的值不會修改bstRoot

0
private boolean put(Node<T,S> node, Node<T,S> root){ 
     if(root == null){ 
      root = node; 
     } 
     else{ 
      if(root.compareTo(node) < 0){ 
       put(node, root.getRightChild()); 
      } 
      else{ 
       put(node, root.getLeftChild()); 
      } 
     } 
     return true; 
    } 

這裏root有一個本地作用域。您必須將此根設置爲bstRoot。因爲bstRoot是實例變量。

相關問題