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

我有这个轮廓:

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变量时,编译器会提示:



我承认泛型对我来说就像magic,但是我可以以某种方式承认FooDelegator不是扩展Delegator 的Foo,它只是实现了两个接口(interface)。

既然很明显我想完成什么,我有什么可以做的。泛型来解决它,还是我最好忘记它?

最佳答案

根据您的定义,Delegator是其自身的Delegator(例如Comparable),但是似乎意图是Delegator是父类(super class)的Delegator。幸运的是,泛型有一种表达方式:

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

这表示“Delagator类型必须是T的父类(super class)”。进行此更改后,原始代码的其余部分将编译:
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>();
}

此外,无论何时使用通用 super 绑定(bind),您的代码看起来都非常酷:)

注意:以下内容最初是问题中的“第一选择”。
还有另一种方法可以使您的代码编译,但是它是劣等的,因为它失去了Delegator类型与它所委托(delegate)的内容之间的联系:
// Not recommended, but will allow compile:
static class FooDelegator implements Delegator<FooDelegator>, Foo {}
// However, this also compiles :(
static class FooDelegator implements Delegator<FooDelegator>, Bar {}

关于java - 为什么此类型不能有效替代type参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7032941/

10-12 03:46