类型边界:使用多个边界传播参数

时间:2015-09-23 06:09:11

标签: java generics type-bounds

考虑以下(不可交换的)API:

<iframe id ='myframe' src='www.mysite.com' onload="onLoadHandler();"></iframe>

现在我编写了一个接受一般msgid "10" msgstr "" 的类,但如果该参数也是interface Bar {} class Foo { public static <T extends Foo & Bar> void doFoo(T param) { System.out.println("I shall be your ruler"); } } ,我想在某种方法中另外执行Foo

Bar

doFoo的使用示例:

class Holder {
    public Holder(Foo foo) {
        this.foo = foo;
    }
    public void takeOverTheWorld() {
        if(this.foo instanceof Bar) {
            // Here I want to execute doFoo(), but I can't hand it over
            // because the bounds don't match
            // doFoo(this.foo);
        )
        // Enstablish my reign
    }
}

正如代码注释中所提到的,我在Holder类中调用doFoo()时遇到问题,因为当时没有确切的类型可以扩展Holder 实现{{ 1}},所以我不能简单地将它投射到这种类型。有没有办法绕过这个而不改变class Yes extends Foo implements Bar { } // ------ Holder h = new Holder(new Yes()); h.takeOverTheWorld(); // Should print "I shall be your ruler" FooBar的界面?

2 个答案:

答案 0 :(得分:2)

您可以在私人帮助器方法中调用doFoo,该方法为演员阵容引入了正确的类型:

public void takeOverTheWorld() {
    if(this.foo instanceof Bar)
        doBarFoo();
}

private <T extends Foo & Bar> void doBarFoo() {
    Foo.doFoo((T)this.foo);
}

如果您不介意该类型是公共接口的一部分,您甚至可以在takeOverTheWorld中执行此操作:

public <T extends Foo & Bar> void takeOverTheWorld() {
    if(this.foo instanceof Bar)
        Foo.doFoo((T)this.foo);
}

答案 1 :(得分:0)

创建Holder的通用子类:

class SubHolder<T extends Foo & Bar> extends Holder {
  private T fooT;

  SubHolder(T foo) {
    super(foo);
    this.fooT = fooT;
  }

  @Override void takeOverTheWorld() {
    Foo.doFoo(fooT);
  }
}