2013-12-09 23 views
0

我在嘗試從對象轉換爲泛型時遇到了警告。 由於我的內部Node類的底層數據結構是一個數組,因此無法創建節點泛型,因爲我無法創建泛型數組,因此我的val參數必須是對象。將對象投射到通用(或將內部類變量存儲爲通用)

是否有任何解決方法或更好的方法來做到這一點?我可以壓制警告,但我不確定這是否會引起我應該關注的後果。我也在製作不同的樹來實現MyTreeI,並且都會有不同的Node結構(所以我不能只做一個實際的Node類(甚至可以工作嗎?我也不知道))

防爆代碼在這裏:

public class MyTree<E> implements MyTreeI<E> { 
    private Node root;  // root of tree 


    private static class Node { 
     private Object val; 
     private Node[] children = new Node[2]; 
    } 

    public MyTree() { 
    } 


    @Override 
    public E get(String key) { 
     Node x = getNode(key); // helper function, assume it returns node in question 
     return (E) x.val; 
    } 
} 
+4

爲什麼你不能讓節點使用'E'爲'val',和兒童'名單'的類型,而不是數組? –

+0

我不能讓E的val類型,因爲我不能從靜態引用中引用非靜態類型...並且使它成爲List - 我有很多其他代碼已經利用了事實上它是一個數組 - 我可以將其全部更改爲使用列表,但是我更傾向於將它保持原樣並壓制警告,而不是重做所有代碼 - 或者這是一個壞主意? – gadu

+2

Node類也必須是通用的:'私有靜態類節點',並且根的類型應該是'Node ',以及'x'。 'getNode()'應該返回'Node '等等。你當然可以使用一個數組,但是你會得到類型安全警告。 –

回答

1

我不能讓節點一般,因爲我無法創建通用陣列

製作Node GE neric不會阻止你使用Node的數組。您無法創建new Node<E>[...],爲true;但您可以創建new Node<?>[...]new Node[...]並將其轉換爲Node<E>[],或者將children的類型更改爲Node<?>[]。有很多可能的方法來做到這一點。

public class MyTree<E> implements MyTreeI<E> { 
    private Node<E> root;  // root of tree 


    private static class Node<E> { 
     private E val; 
     private Node<E>[] children = (Node<E>[])new Node<?>[2]; 
    } 

    public MyTree() { 
    } 


    @Override 
    public E get(String key) { 
     Node<E> x = getNode(key); // helper function, assume it returns node in question 
     return x.val; 
    } 
}