Java 类型边界:使用多个边界传播参数
考虑以下(不可更改的)API:Java 类型边界:使用多个边界传播参数,java,generics,type-bounds,Java,Generics,Type Bounds,考虑以下(不可更改的)API: 支架的示例用法: class Yes extends Foo implements Bar { } // ------ Holder h = new Holder(new Yes()); h.takeOverTheWorld(); // Should print "I shall be your ruler" 正如代码注释中提到的,我在Holder类中调用doFoo()时遇到问题,因为当时没有确切的类型可以扩展Foo和implementBar,所以我不能简单地将
支架的示例用法
:
class Yes extends Foo implements Bar {
}
// ------
Holder h = new Holder(new Yes());
h.takeOverTheWorld(); // Should print "I shall be your ruler"
正如代码注释中提到的,我在Holder类中调用doFoo()时遇到问题,因为当时没有确切的类型可以扩展
Foo
和implementBar
,所以我不能简单地将其转换为这样的类型。有没有一种方法可以在不改变Holder
、Foo
和Bar
的界面的情况下解决这个问题?您可以在一个私人助手方法中调用doFoo
,该方法引入了正确的类型:
public void takeOverTheWorld() {
if(this.foo instanceof Bar)
doBarFoo();
}
private <T extends Foo & Bar> void doBarFoo() {
Foo.doFoo((T)this.foo);
}
创建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);
}
}
class-SubHolder扩展支架{
私人T型脚;
副标题(T-foo){
超级(富);;
这个。英尺=英尺;
}
@重写void takeOverTheWorld(){
Foo.doFoo(脚);
}
}
这将改变Holder的接口,因为该类现在将是泛型的,只用于做除该类之外没有人需要知道的事情。从封装的角度来看,这不是一个很好的解决方案。我会记住这一点:如果你不能正常地使用私有方法来“推断”类型,哈哈
public void takeOverTheWorld() {
if(this.foo instanceof Bar)
doBarFoo();
}
private <T extends Foo & Bar> void doBarFoo() {
Foo.doFoo((T)this.foo);
}
public <T extends Foo & Bar> void takeOverTheWorld() {
if(this.foo instanceof Bar)
Foo.doFoo((T)this.foo);
}
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);
}
}