假设我们有两个通用Java接口:Foo<T>
和Bar<T>
,其中可能有许多实现。现在,假设我们想要将每个中的一个存储在一个类中,两者都使用T
的相同值,但保持确切的实现类型:
public interface FooBar<T, TFoo extends Foo<T>, TBar extends Bar<T>> {
TFoo getFoo();
TBar getBar();
}
上面,T
的唯一目的是强制TFoo
和TBar
的类使用相同的类型参数。将此类型参数添加到FooBar
似乎是多余的,原因有两个:
FooBar
实际上并不关心T
。T
也可以从TFoo
和TBar
推断出来。因此,我的问题是,是否有办法强制执行此类条件而不会使FooBar
的类型参数列表混乱。必须编写FooBar<String, StringFoo, StringBar>
而不是理论等效FooBar<StringFoo, StringBar>
看起来很难看。
答案 0 :(得分:2)
不幸的是,没有更好的方法......编译器需要声明T类型才能使用它,并且没有其他地方可以声明它:
编辑:不相关的链接 <击> 撞击> <击> 击><击>如果未首先指定绑定A,则会出现编译时错误:
击>class D <T extends B & A & C> { /* ... */ } // compile-time error
<击>(extract from this doc) 击>
这有点偏离主题,但this doc将类型参数名称的约定定义为单个大写字母。