【发布时间】:2015-10-21 16:28:44
【问题描述】:
对不起,如果标题很烂,不知道如何问这个问题......
假设我有一些带有参数的接口 Foo
public interface IFoo<Bar extends IBar>{
public Bar generateBar();
}
我还有另一个类,它接受一个 foo 对象并将生成一个 bar 对象。我可以这样定义。
public class FooBar<Bar extends IBar, Foo extends IFoo<Bar>>{
private Foo foo;
public FooBar(Foo foo){
this.foo = foo;
}
public Bar getBar(){
this.foo.generateBar();
}
这一切都很好。但是,将 Bar 定义为 FooBar 类的参数对我来说似乎很愚蠢。 IFoo 对象将被参数化以获取 Bar 值,因此我假设我可以从 Foo 对象具有的任何参数推断 Bar 的类型;从而避免有人在每次定义 FooBar 对象时都必须提供两个参数。
有什么办法可以做到这一点吗?不是让 Bar 成为 FooBar 参数化类型的一部分,而是从 Foo 的参数中推断出来?
编辑:答案似乎是无法完成,正如已经回答的那样。但是,我将把它留到另一天,因为我希望有人可以发布一个答案,不仅可以做到,而且为什么不可能。具体来说,这仅仅是 java 开发人员从未选择支持的用例,还是有一个原因,支持其他参数化检查的相同编译时类型检查无法通过查看特定的 IFoo 类型参数来推断 Bar 类型。编译器不能确定 IFoo 参数以及任何参数化类型吗?
【问题讨论】:
-
是的,这在使用现场很烦人。还没有看到任何好的解决方案:) 如果使用站点碰巧不需要
getBar(),您可以改用FooBar<?, SomeFoo<SomeBar>>类型。