考虑以下(不可交换的)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"
,Foo
和Bar
的界面?
答案 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);
}
}