我有这些(简化的)课程:
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>
,为什么编译器仅将其视为方法返回类型而不是方法参数?
答案 0 :(得分:4)
您在extends
的{{1}}子句中缺少type参数。没有它,您将扩展原始TestsDataSource
,这意味着BaseDataSource
将进行类型擦除变为T
。在Object
子句中为T
- Test
提供类型参数。
extends