抽象方法中的通用列表

时间:2016-04-28 10:04:21

标签: java android generics abstract-class

我有一个像这样的Base抽象类:

public abstract class BaseModel {
//some code
}

我正在使用另一个这样的Base抽象类来扩展它:

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

我的错是什么?

2 个答案:

答案 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);
    }
}
在返回数据之前

// typecast。 它可能对你有帮助。

答案 1 :(得分: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;
    }
}