答案可以归结为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
,将失败,并显示以下错误我的问题是为什么?对我来说,似乎编译器应该有足够的信息,因为ojit_code明确定义为实现
TypicalJavaFooBar
和Foo
;为什么还不够满足Bar
约束?更新
本练习的主要目的是定义以下协定:确保在
Foo & Bar
实例上调用方法foobar
可以返回实现FooBar
和Foo
的内容。 最佳答案
类型参数R
通过调用代码绑定(bind)到该方法,理论上可以是Baz implements Foo, Bar
;例如,参见Collections.emptySet()
,其类型参数由调用方确定,并可能受类型见证人影响。
要执行您显然要尝试的操作,您需要将type参数移到FooBar
接口(interface)上,并使用TypicalJavaFooBar implements Foo, Bar, FooBar<TypicalJavaFooBar>
。