[英]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傳遞的 。 因此,第二種方法中的root
是bstRoot
的副本,修改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.