2010-01-25 19 views
9

Aşağıdaki gibi alt sınıf oluşturmak istediğim jenerikleştirilmiş bir sınıfım var:Java: Genelleştirilmiş bir sınıfı alt sınıflara ayırma

public class SomeTable<T extends BaseTableEntry> 
    extends BaseTable<T> 
{ 

    public SomeTable(int rows, int cols) 
    { 
     super(rows, cols, SomeTableEntry.class); 
     //Does not compile: 
     //Cannot find symbol: constructor BaseTable(int, int, java.lang.Class<blah.blah.SomeTableEntry.class>) 
    } 
} 

... burada genelleştirilmiş süper sınıf:

public class BaseTable<T extends BaseTableEntry> 
{ 

    public BaseTable(int rows, int cols, Class<T> clasz) 
    { 
     ... 
    } 
... 
} 

Derleyici hatasını anlıyorum, ancak bir geçici çözüm bulamıyor gibi görünmüyor SomeTable yapıcısında ek bir parametre eklemekten başka.

Herhangi bir öneriniz var mı?

Teşekkürler!

+1

alt sınıf da genel olması gerekir? Veya SomeTable, BaseTable genişletebilir mi? – Thilo

+0

Hayır, 'SomeTable'ın genelleştirilmiş olması gerekmez, 'publicTable genişletir publicTable publicTable ' fine. – bguiz

cevap

10

Bu derler:

public class SomeTable extends BaseTable<SomeTableEntry> { 
    public SomeTable(int rows, int cols) 
    { 
     super(rows, cols, SomeTableEntry.class); 
    } 
} 

bir alçı ile çalışır:

public class SomeTable<T extends BaseTableEntry> extends BaseTable<T> { 
    public SomeTable(int rows, int cols) 
    { 
     super(rows, cols, (Class<T>)SomeTableEntry.class); 
    } 
} 

ama derleyici sınıf için döküm gerektirir niçin açıklama gönderme birine arıyorum.

+0

+1. Eğer gerçekten de SomeTable'ın jenerik olması gerekiyorsa, ekstra sınıf parametresi ile superclass kurucusunu çoğaltması gerekecek. – Thilo

+0

@SteveB .: Sadece programcının ne yaptığını bildiğinden emin olmak için. 'super (satırlar, cols, (Class ) Object.class)' da çalışacak, ancak bir cast yaparak sorumluluğu üstleniyor '. –

+0

Re: cast: Bu cast ile "güvensiz cast" derleme uyarısı var ... – Thilo

3

Bu temel sınıf ile yaptığımız gibi ona aynı şekilde Class geçmesi jenerik eğer SomeTable kurucusu tanımlamak mümkündür:

public class BaseTable<T extends BaseTableEntry> 
{ 
    public BaseTable(int rows, int cols, Class<? extends T> clazz) 
    { 
     // ... 
    } 
} 

class SomeTable<T extends BaseTableEntry> 
extends BaseTable<T> 
{ 
    public SomeTable(int rows, int cols, Class<? extends T> clazz) 
    { 
     super(rows, cols, clazz); 
    } 
} 
İlgili konular