给出这样的通用函数:
<C0 extends Collection<A>, C1 extends Collection<B>, A, B> void foo(C0 a, C1 b);
问题1:如何强制执行C0和C1 完全相同的集合类型?
问题2:下面显示的代码语法错误,但有没有办法实现这个目标?
我希望能够写出这样的东西。它更短,更容易理解。
<C extends Collection, A, B> void foo(C<A> a, C<B> b);
答案 0 :(得分:0)
当然,这是一次彻底的黑客攻击,但是......
您可以使用重载来提供List版本,Set版本等等。显然,您可以使它们完全相同,通过提供具体实现的极端类型,而不是它们的接口类型。
有时库使用生成代码的预编译步骤来执行类似的操作。
或者,(另一个hack),您可以创建一个包含两列的类,并使用单个泛型参数化 类型。