2016-05-01 15 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ではなく、キー10とNodeオブジェクトの値に設定されるので、まだnullです値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

問題は次のとおりです。

return put(node, bstRoot); 

あなたの第二put方法は次のようになります:あなたの最初のputの方法では、あなたがこれを行うので、

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

を、最初put方法であなたは、第二putためroot引数としてbstRootを渡します方法。

bstRootが参照渡しされると思われるので、2番目のputメソッドはbstRootに設定されます。

これは該当しません。 Javaの場合、すべてはとなります。です。したがって、2番目の方法の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; 
    } 

ここで、ルートにはローカルスコープがあります。このルートをbstRootに設定する必要があります。 bstRootはインスタンス変数であるためです。

関連する問題