【发布时间】:2011-10-25 08:46:47
【问题描述】:
我正在尝试使用泛型来支持委托对象(装饰器、包装器)的可配置结构。我想构建一个实现目标接口和通用委托接口的委托链。
我有这个大纲:
class Test {
static interface Delegator<T> {}
static class DelegatorChain<T extends Delegator<T>> {}
static interface Foo {}
static class FooDelegator implements Delegator<Foo>, Foo {}
public static void main(String[] args) {
DelegatorChain<FooDelegator> chain = new DelegatorChain<FooDelegator>();
}
}
但是,当尝试实例化 chain 变量时,编译器会报错:
绑定不匹配:Test.FooDelegator 类型不是
Test.DelegatorChain<T>类型的有界参数<T extends Test.Delegator<T>>的有效替代品
我承认泛型对我来说就像 magic,但我可以以某种方式承认 FooDelegator 不是 扩展 Delegator
鉴于我想完成什么很清楚,有什么我可以做的吗?泛型来修复它,还是我最好忘记它?
【问题讨论】:
-
为什么你的 DelegatorChain 的泛型类型需要扩展 Delegator
?您的委托人类正在提供类型信息。 Delegator 所需,FooDelegator 提供委托实现。 -
它无法编译,因为
Foo不是Delegator。 nabeelalimemon.com/blog/2011/01/self-bound-generic-types -
是的 类型不匹配。 DelegatorChain 中的泛型类型
是“FooDelegator”,但 Delegator 中所需的泛型类型是“Foo”。您将需要我在答案中提供的额外通用类型参数,以使其按您的预期工作,我相信。或者只是离开约束。 -
我的问题是,从设计的角度来看,DelegatorChain 是否需要知道它包含哪个 Delegator 以及 Delegator 实现的接口?该问题的答案可能会影响已提交的哪些答案更适合您的需求。
-
@ty1824,还在想……是的,它确实需要两者都知道。最后,整个结构应该能够充当 Foo。