为什么Java编译器无法正确推断继承?

And*_*rey 5 java generics

回答归结为Java does not support lower bounds on parameterized methods, because such a feature is "not useful enough",请参考类似的问题

给出以下代码段:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

没有显式转换RTypicalJavaFooBar#foobar编译器失败,出现以下错误

错误:(13,20)java:不兼容类型:demo.Demo.TypicalJavaFooBar无法转换为R

我的问题是为什么?对我来说,似乎编译器应该有足够的信息,因为TypicalJavaFooBar被明确定义同时实现FooBar; 为什么不足以满足Foo & Bar约束?

UPDATE

这项工作的主要目标是定义如下合同:调用方法foobar对一个实例的FooBar保证返回的东西同时实现FooBar.

chr*_*ke- 6

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

要执行您正在尝试的操作,您需要将type参数移动到界面上FooBar并具有TypicalJavaFooBar implements Foo, Bar, FooBar<TypicalJavaFooBar>.