我有一个实体的类层次结构,并希望在Java中为它们创建服务接口的层次结构。然后,UI组件应通过接口访问与实体相关的服务:
class BaseEntity { }
class Fruit extends BaseEntity { }
class Banana extends Fruit { }
class Apple extends Fruit { }
一个UI组件(在稍微不同的上下文中的多个地方重用)需要通过FruitService接口访问Fruit服务,我想在运行时决定这将是BananaService或AppleService服务接口。我认为使用泛型这很简单:
interface Service<T extends BaseEntity>
{
List<T> getAll();
void save (T object);
void delete (T object);
}
// More strict interface only allowed for fruits. Referenced by UI component
interface FruitService<F extends Fruit> extends Service<Fruit> {}
// Interface only allowed for bananas
interface BananaService extends FruitService<Banana> {}
class BananaServiceImpl implements BananaService
{
// Compiler error here because expecting Fruit type:
@Override
public List<Banana> getAll()
{
}
...
}
然而,这给了我以下编译器错误:
The return type is incompatible with Service<Fruit>.getAll()
为什么Java不认识到实现已经使用Banana进行参数化?我希望BananaServiceImpl中的泛型参数可以解析为我在BananaService中指定的Banana!
答案 0 :(得分:9)
interface FruitService<F extends Fruit> extends Service<Fruit> {}
应该是
interface FruitService<F extends Fruit> extends Service<F> {}
这样,您将通用转移到服务