Java泛型有界类型不适用于方法参数

时间:2015-02-18 17:29:48

标签: java generics extends

我有这些(简化的)课程:

public abstract class BaseDataSource<T extends BaseDbPojo> {

    public abstract List<T> getAllEntities();
    public abstract boolean deleteEntity(T t);
}

public class TestsDataSource extends BaseDataSource {

    @Override
    public List<Test> getAllEntities() {...}

    @Override
    public boolean deleteEntity(Test t) {...}
}

Test扩展BaseDbPojo

现在,getAllEnities()一切都很好 - 它被认为是超级抽象方法的有效覆盖。 另一方面,deleteEntity(Test t)不是,并且接受派生类型BaseDbPojo的任何其他方法都会引发补偿错误。

我的IDE(InteliJ)建议:

@Override
public boolean deleteEntity(BaseDbPojo baseDbPojo) {...}

这显然不是我想要的 - 我希望该方法在我们的案例中接收BaseDbPojo - Test的子类。

如果我在类范围中声明<T extends BaseDbPojo>,为什么编译器仅将其视为方法返回类型而不是方法参数?

1 个答案:

答案 0 :(得分:4)

您在extends的{​​{1}}子句中缺少type参数。没有它,您将扩展原始TestsDataSource,这意味着BaseDataSource将进行类型擦除变为T。在Object子句中为T - Test提供类型参数。

extends