簡體   English   中英

Java將通用類型對象作為方法參數傳遞

[英]Java passing a generic type object as method argument

我有以下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仍為null,而不是使用鍵10和值Hello10將其設置為Node對象的值。 那不是通過引用嗎?

問題如下。 在第一個put方法中,您可以執行以下操作:

return put(node, bstRoot);

您的第二個put方法如下所示:

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

因此,在第一個put方法中,將bstRoot傳遞為第二個put方法的root參數。

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

不是這種情況。 在Java中, 一切都是通過value傳遞的 因此,第二種方法中的rootbstRoot的副本,修改root的值不會修改bstRoot

這看起來不太正確:

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

為什么? root是您的方法中定義的變量。 它的生命周期與實例中的字段不同。

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

在這里將bstRoot實際用於空樹會更可靠。

if(bstRoot == null){
    bstRoot = node;
}
 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是實例變量。

暫無
暫無

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

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