答案可以归结为Java does not support lower bounds on parameterized methods, because such a feature is "not useful enough",请引用similar question

给出以下代码段:

package demo;

public class Demo {
    interface Foo { void foo(); }
    interface Bar { void bar(); }
    interface FooBar {
      <R extends Foo & Bar> R foobar();

      static FooBar create() { return new TypicalJavaFooBar(); }
    }

    private static final class TypicalJavaFooBar implements Foo, Bar, FooBar {
        public void bar() { System.out.println("foo"); }
        public void foo() { System.out.println("bar"); }

        public <R extends Foo & Bar> R foobar() {
            return (R) this;
        }
    }

    public static void main(String[] args) {
        FooBar x = FooBar.create();
        Foo foo = x.foobar();
        Bar bar = x.foobar();
        x.foobar().foo();
        x.foobar().bar();
    }
}

没有在R编译器中显式转换为TypicalJavaFooBar#foobar,将失败,并显示以下错误



我的问题是为什么?对我来说,似乎编译器应该有足够的信息,因为o​​jit_code明确定义为实现TypicalJavaFooBarFoo;为什么还不够满足​​Bar约束?

更新

本练习的主要目的是定义以下协定:确保在Foo & Bar实例上调用方法foobar可以返回实现FooBarFoo的内容。

最佳答案

类型参数R通过调用代码绑定(bind)到该方法,理论上可以是Baz implements Foo, Bar;例如,参见Collections.emptySet(),其类型参数由调用方确定,并可能受类型见证人影响。

要执行您显然要尝试的操作,您需要将type参数移到FooBar接口(interface)上,并使用TypicalJavaFooBar implements Foo, Bar, FooBar<TypicalJavaFooBar>

10-05 21:52