سؤال

لدي فئة عامة أرغب في فئة فرعية على النحو التالي:

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 البناء.

أي اقتراحات؟

شكرًا!

هل كانت مفيدة؟

المحلول

هذا يجمع:

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

لكنني أتطلع إلى شخص ما ينشر التفسير لسبب أن المترجم يتطلب الممثلين للفصل.

نصائح أخرى

من الممكن تحديد SomeTable مُنشئ بشكل عام إذا مررت Class بنفس الطريقة التي تفعل بها مع الفصل الأساسي:

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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top