我想要一个类对象,但我想强制它所代表的任何类扩展类a并实现接口B.
我能做到:
Class<? extends ClassA>
或者:
Class<? extends InterfaceB>
但我不能两者兼得.有办法做到这一点吗?
我想要一个类对象,但我想强制它所代表的任何类扩展类a并实现接口B.
我能做到:
Class<? extends ClassA>
或者:
Class<? extends InterfaceB>
但我不能两者兼得.有办法做到这一点吗?
事实上,你想怎么做就怎么做.如果你想提供多个接口或一个类加接口,你必须让你的通配符看起来像这样:
<T extends ClassA & InterfaceB>
请参阅sun.com上的Generics Tutorial,特别是页面底部的Bounded Type Parameters部分.如果愿意,您实际上可以列出多个接口,您需要的每个接口都使用& InterfaceName
.
这可能会变得任意复杂.要进行演示,请参阅JavaDoc声明Collections#max
,它(换成两行)是:
public static <T extends Object & Comparable<? super T>> T
max(Collection<? extends T> coll)
为什么这么复杂?正如Java Generics常见问题解答中所说:To preserve binary compatibility.
这似乎不适用于变量声明,但在类上放置泛型边界时确实有效.因此,要想做你想做的事,你可能需要跳过几圈.但你可以做到.您可以这样做,在类上设置一个通用边界,然后:
class classB { }
interface interfaceC { }
public class MyClass<T extends classB & interfaceC> {
Class<T> variable;
}
才能得到有你想要的限制的variable
.有关更多信息和示例,请查看第3页(共Generics in Java 5.0页).请注意,在<T extends B & C>
中,类名必须在前面,接口在后面.当然,你只能列出一个班级.