java - 类型边界 : Propagate parameter with multiple bounds

标签 java generics type-bounds

考虑以下(不可更改的)API:

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的使用示例:

class Yes extends Foo implements Bar {
}
// ------
Holder h = new Holder(new Yes());
h.takeOverTheWorld(); // Should print "I shall be your ruler"

正如代码注释中提到的,我在 Holder 类中调用 doFoo() 时遇到问题,因为当时不知道扩展 Foo and 的确切类型实现 Bar,所以我不能简单地将它转换为这样的类型。有没有办法在不改变 HolderFooBar 界面的情况下解决这个问题?

最佳答案

您可以在私有(private)帮助器方法中调用doFoo,该方法为强制转换引入正确的类型:

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

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

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

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

关于java - 类型边界 : Propagate parameter with multiple bounds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32732203/

相关文章:

syntax - 在结构类型中包装 RefCell 和 Rc

java - 如何在一个下拉列表中显示绑定(bind)在一起的 2 个元素

java - 如何在groovy中打印特殊字符

java - 在 Android 中更新应用程序后,我的 Assets 文件夹中的图像未替换

java - 从非同步方法访问的同步对象

c# - 在 C# 中,您可以在 "where"接口(interface)约束中放置一个 Or 吗?

java - 如何使用接口(interface)作为 map 的键

未明确指定类型参数时,Scala 下限类型参数不起作用

scala - 为什么类型参数绑定(bind)的方法 > : allow subtypes?

javascript - Javascript 中具有泛型的高阶类?