2016-04-28 3 views
1

У меня есть базовый абстрактный класс как это:Общий список в абстрактный метод

public abstract class BaseModel { 
//some code 
} 

Я распространив его с другой базы абстрактного класса, как это:

public abstract class BaseChildParentModel extends BaseModel { 

    public abstract <E extends BaseModel> List<E> getChildren(); 

    public abstract <E extends BaseModel> List<E> createChildList(); 

    public void addChild(BaseModel child) { 
     List<BaseModel> children = getChildren(); 
     if (children == null) 
      children = createChildList(); 
     children.add(child); 
    } 
} 

Мой последний класс продлить BaseChildParentModel как это :

public class Subject extends BaseChildParentModel { 

//some fields 

    public ArrayList<Subject> ChildSubjects; 

    @Override 
    public <E extends BaseModel> List<E> getChildren() { 
     return ChildSubjects; 
    } 

    @Override 
    public <E extends BaseModel> List<E> createChildList() { 
     ChildSubjects = new ArrayList<>(); 
     return ChildSubjects; 
    } 
} 

На компиляции я получаю следующее сообщение об ошибке:

Error:(52, 16) error: incompatible types 
required: List<E> 
found: ArrayList<Subject> 
where E is a type-variable: 
E extends BaseModel declared in method <E>getChildren() 

и

Error:(58, 16) error: incompatible types 
required: List<E> 
found: ArrayList<Subject> 
where E is a type-variable: 
E extends BaseModel declared in method <E>createChildList() 

Какова моя вина?

+0

Попробуйте изменить общественное ArrayList ChildSubjects; to public List ChildSubjects; –

+0

Я меняю его, но получаю такую ​​же ошибку. –

+0

Попробуйте мой ответ ниже –

ответ

0

Попробуйте это:

public abstract class Subject extends BaseChildParentModel { 
    public List<Subject> ChildSubjects; 

    @Override 
    public <E extends BaseModel> List<E> getChildren() { 
     return (List<E>) ChildSubjects; 
    } 

    @Override 
    public <E extends BaseModel> List<E> createChildList() { 
     ChildSubjects = new ArrayList<>(); 
     return (List<E>) ChildSubjects; 
    } 
} 
+0

Ошибки, очищенные и скомпилированные, являются успешными. но я получаю предупреждение без предупреждения. Я завершаю код для проверки его во время выполнения. если его ОК, я приму ваш ответ. –

0

// попробуйте этот код

public class Subject extends BaseChildParentModel { 

//some fields 

    public ArrayList<Subject> ChildSubjects; 

    @Override 
    public <E extends BaseModel> List<E> getChildren() { 
     return ((E)ChildSubjects); 
    } 

    @Override 
    public <E extends BaseModel> List<E> createChildList() { 
     ChildSubjects = new ArrayList<>(); 
     return ((E)ChildSubjects); 
    } 
} 

// приведение типа перед возвращением данных. это может быть полезно для вас.

Смежные вопросы