2010-01-25 15 views
9

मेरे पास एक जेनेरिक क्लास है जो मैं निम्नानुसार उपclass करना चाहता हूं:जावा: जेनेरिक क्लास को उपclassing

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>) 
    } 
} 

... जहां जेनेरिक सुपरक्लास है:

public class BaseTable<T extends BaseTableEntry> 
{ 

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

मैं संकलक त्रुटि को समझता हूं, लेकिन एक कामकाज नहीं लग रहा है , SomeTable कन्स्ट्रक्टर में एक अतिरिक्त पैरामीटर शामिल करने के अलावा।

कोई सुझाव?

धन्यवाद!

+1

उपवर्ग भी सामान्य होने की जरूरत है? या यह कुछटेबल हो सकता है बेसटेबल ? – Thilo

+0

नहीं, 'कुछटेबल' को जेनेरिक करने की आवश्यकता नहीं है, 'पब्लिक क्लास कुछटेबल बेसटेबल ' ठीक है। – bguiz

उत्तर

10

यह संकलित:

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

यह एक कलाकारों के साथ काम करता है:

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

लेकिन मैं क्यों संकलक वर्ग के लिए कलाकारों की आवश्यकता है के लिए विवरण पोस्टिंग किसी की प्रतीक्षा कर रही हूँ।

+0

+1। अगर उसे वास्तव में सामान्य होने के लिए कुछ योग्यता की ज़रूरत है, तो मुझे लगता है कि उसे अतिरिक्त कक्षा पैरामीटर के साथ सुपरक्लास कन्स्ट्रक्टर को डुप्लिकेट करना होगा। – Thilo

+0

@SteveB .: बस यह सुनिश्चित करने के लिए कि प्रोग्रामर जानता है कि वह क्या कर रहा है। 'सुपर (पंक्तियों, कोल्स, (कक्षा ) ऑब्जेक्ट.क्लास) 'भी काम करेगा, लेकिन एक कलाकार करके आप जिम्मेदारी ले रहे हैं'। –

+0

पुन: कास्ट: उस कास्ट के साथ संकलन चेतावनी "असुरक्षित कलाकार" है ... – Thilo

3

यह सामान्य रूप से यदि आप के रूप में आप आधार वर्ग के साथ क्या Class इसे करने के लिए एक ही तरह से पारित SomeTable निर्माता परिभाषित करना संभव है:

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); 
    } 
}