Java 泛型有界类型不适用于方法参数
Java Generics bounded type doesn't apply to method parameters
我有这些(简体)classes:
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
的子 class - 在我们的例子中是 Test
。
如果我在 class 范围内声明了 <T extends BaseDbPojo>
,为什么编译器只将其视为方法 return 类型而不是方法参数?
TestsDataSource
的 extends
子句中缺少类型参数。没有它,您将扩展原始 BaseDataSource
,这意味着 T
经历类型擦除成为 Object
。在 extends
子句中为 T
-- Test
-- 提供类型参数。
class TestsDataSource extends BaseDataSource<Test> {
我有这些(简体)classes:
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
的子 class - 在我们的例子中是 Test
。
如果我在 class 范围内声明了 <T extends BaseDbPojo>
,为什么编译器只将其视为方法 return 类型而不是方法参数?
TestsDataSource
的 extends
子句中缺少类型参数。没有它,您将扩展原始 BaseDataSource
,这意味着 T
经历类型擦除成为 Object
。在 extends
子句中为 T
-- Test
-- 提供类型参数。
class TestsDataSource extends BaseDataSource<Test> {