2010-11-17 8 views
16
public static BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode left = BTNode.treeCopy(source.left); 
     BTNode right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 

} 

Le mie domande è perché non è possibile utilizzare il Tipo E generico in un contesto statico? Ho provato a cercare più risposte e non ho trovato nulla che faccia diventare sneso.Utilizzo di tipi generici in un contesto statico

+0

possibile duplicato di [metodo statico in una classe generica?] (Http://stackoverflow.com/questions/936377/static-method-in-a-generic-class) –

risposta

19

è necessario dichiarare il tipo generico nella firma del metodo:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 
{ 
    if(source == null) 
     return null; 
    else 
    { 
     BTNode<E> left = BTNode.treeCopy(source.left); 
     BTNode<E> right = BTNode.treeCopy(source.right); 
     return new BTNode(source.data, left, right); 
    } 
} 
7

E può significare qualsiasi cosa. Per utilizzare E (come generico) è necessario creare un'istanza di un oggetto. Non è possibile farlo se si dispone di un metodo statico perché i parametri di tipo generici sono solo nell'ambito di un'istanza della classe (che include i suoi metodi di istanza e campi di istanza).

Membri e campi statici appartengono a ogni istanza della classe. Quindi, se hai un'istanza di BTNode<String> e un'altra istanza di BTNode<Integer>, che cosa dovrebbe utilizzare esattamente la treeCopy statica? String o Integer?

C'è un workaroud; devi dire al metodo statico cosa significa "E". Quindi si dovrà definire in questo modo:

public static <E> BTNode<E> treeCopy(BTNode<E> source) 

Sarebbe anche aiutare a dare una seconda occhiata al vostro disegno e vedere se questo è in realtà ciò che si desidera.