我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。
我可以:
Class<? extends ClassA>
要么:
Class<? extends InterfaceB>
但我不能两者都做。有没有办法做到这一点?
实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样:
<T extends ClassA & InterfaceB>
请参见sun.com上的泛型教程,特别是页面底部的“ 绑定类型参数”部分。实际上,如果需要,你可以列出多个接口,并& InterfaceName根据需要使用每个接口。
这会变得任意复杂。为了演示,请参阅的JavaDoc声明Collections#max(分为两行)为:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
为什么这么复杂?如Java泛型常见问题解答中所述:保留二进制兼容性。
看起来这不适用于变量声明,但是在类上放置通用边界时它确实起作用。因此,要做你想做的事情,你可能不得不跳过几圈。但是你可以做到的。你可以执行以下操作,在类上放置通用边界,然后:
class classB { } interface interfaceC { } public class MyClass<T extends classB & interfaceC> { Class<T> variable; }
得到variable具有你想要的限制。有关更多信息和示例,请查阅Java 5.0中的泛型的第3页。注意,在中<T extends B & C>,类名必须排在最前面,然后是接口。当然,你只能列出一个班级。
<T extends B & C>