Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型边界:使用多个边界传播参数_Java_Generics_Type Bounds - Fatal编程技术网

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

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,所以我不能简单地将

考虑以下(不可更改的)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
implement
Bar
,所以我不能简单地将其转换为这样的类型。有没有一种方法可以在不改变
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);
  }
}