Java 为什么此类型不是类型参数的有效替代品?

Java 为什么此类型不是类型参数的有效替代品?,java,generics,Java,Generics,我正在尝试使用泛型来支持委托对象(装饰器、包装器)的可配置结构。我想构建一个实现目标接口和通用委托人接口的委托人链 我有一个提纲: class Test { static interface Delegator<T> {} static class DelegatorChain<T extends Delegator<T>> {} static interface Foo {} static class FooDelega

我正在尝试使用泛型来支持委托对象(装饰器、包装器)的可配置结构。我想构建一个实现目标接口和通用委托人接口的委托人链

我有一个提纲:

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>();
    }
}
类测试{
静态接口委托器{}
静态类DelegatorChain{}
静态接口Foo{}
静态类FooDelegator实现Delegator,Foo{}
公共静态void main(字符串[]args){
DelegatorChain=新的DelegatorChain();
}
}
但是,当尝试实例化
变量时,编译器会抱怨:

绑定不匹配:type Test.FooDelegator不是类型
Test.DelegatorChain

我承认泛型对我来说很像,但我可以承认FooDelegator不是一个扩展Delegator的Foo,它只是实现了两个接口


考虑到我想要完成的事情已经很清楚了,我能做些什么w.r.t.泛型来修复它吗,还是忘记它更好?

如果
FooDelegator实现Delegator
Foo实现Delegator
,那么应该做的是。因为这是您对Delegator链的要求:
T实现Delegator

第三种选择也应该有效:

DelegatorChain<T extends Delegator<F>, F> chain; ...
DelegatorChain。。。

看起来这就是您要做的

static interface Delegator<T> {
    }

    static class DelegatorChain<T extends Delegator<C>, C> {
    }

    static interface Foo {
    }

    static class FooDelegator implements Delegator<Foo>, Foo {
    }

    public static void main(String[] args) {
        DelegatorChain<FooDelegator, Foo> chain = new DelegatorChain<FooDelegator, Foo>();
    }
静态接口委托器{
}
静态类委托器链{
}
静态接口Foo{
}
静态类FooDelegator实现Delegator,Foo{
}
公共静态void main(字符串[]args){
DelegatorChain=新的DelegatorChain();
}
由于类型不正确,初始示例无法编译。 DelegatorChain中的泛型类型为“foodegator”,但Delegator中所需的泛型类型为“Foo”。您将需要我在回答中提供的额外泛型类型参数,以使其按预期工作


您还可以完全取消DelegatorChain上的约束,即DelegatorChain。

根据您的定义,Delegator是自身的Delegator(例如Compariable),但其目的似乎是Delegator是超类的Delegator。幸运的是,泛型有一种表达方式:

static class DelegatorChain<T extends Delegator<? super T>> {}

静态类DelegatorChain为什么DelegatorChain的泛型类型需要扩展Delegator?您的delegator类正在提供类型信息。Delegator需要,Foodegator提供Delegator实现。它不会编译,因为
Foo
不是
Delegator
。是的,类型不匹配。DelegatorChain中的泛型类型为“foodegator”,但Delegator中所需的泛型类型为“Foo”。您将需要我在回答中提供的额外泛型类型参数,以使其按照您的意愿工作。我的问题是,从设计的角度来看,DelegatorChain是否需要知道它包含哪个Delegator以及Delegator实现的接口?这个问题的答案可能会影响到哪些已经提交的答案更适合您的需要。@ty1824,仍在思考。。。是的,它确实需要知道两者。最后,整个结构应该能够充当一个Foo。这并不完全相同,相反,这是正确的。它只是多余的,因为当您在另一个泛型类型声明(T)中使用C时,需要将其声明为一个类型。+1我相信这实现了询问者指定的功能,它指定了一个实现目标接口的委托器链。
C
Foo
,还有一个通用的Delegator接口
T
Delegator
。同意,第二个解决方案更干净,只要你能掌握超级概念;-)+我从另一篇文章中复制了我的评论,因为第二种方法确实达到了提问者指定的效果。它指定了一系列实现目标接口
Foo
,以及通用
Delegator
接口
T
Delegator
。不过,我相信第一种方法做得不恰当。我同意——我只是在发布后才意识到这一点。我编辑了答案以反映这一点。
static interface Delegator<T> {}
static class DelegatorChain<T extends Delegator<? super T>> {}
static interface Foo {}
static class FooDelegator implements Delegator<Foo>, Foo {}

public static void main(String[] args) {
    DelegatorChain<FooDelegator> chain = new DelegatorChain<FooDelegator>();
}
// Not recommended, but will allow compile:
static class FooDelegator implements Delegator<FooDelegator>, Foo {} 
// However, this also compiles :(
static class FooDelegator implements Delegator<FooDelegator>, Bar {}