2010-11-17 20 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); 
    } 

} 

Sorularım neden genel E tipini statik bir bağlamda kullanamıyorum? Birçok cevabı araştırmayı denedim, bu da herhangi bir şey yapamayacak.Statik bir bağlamda genel türleri kullanma

+0

olası bir kopyası [Genel bir sınıfta statik yöntem mi?] (Http://stackoverflow.com/questions/936377/static-method-in-a-generic-class) –

cevap

19

Sen yöntem imzası jenerik türü bildirmek gerekir:

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 şey anlamına gelebilir. E'u (genel olarak) kullanmak için bir nesnenin örneğini oluşturmanız gerekir. Statik bir yönteminiz varsa bunu yapamazsınız çünkü genel tür parametreleri yalnızca sınıfın bir örneğinin kapsamıdır (örnek yöntemlerini ve örnek alanlarını içerir).

Statik üyeler ve alanlar, sınıfın her örneğine aittir. Yani, BTNode<String> örneğiniz ve BTNode<Integer> başka bir örneğiniz olsaydı, statik treeCopy tam olarak ne kullanıyor olmalıdır? String veya Integer?

Bir workaroud vardır; E'un ne anlama geldiğini statik yönteme söylemelisiniz. Yani bu şekilde tanımlamak gerekir: Aynı zamanda tasarım ikinci bir göz atın ve bu ne istediğinizi gerçekten olup olmadığını görmek için yardımcı olacağını

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

.

İlgili konular