多类的Java泛型通配符
我想要一个Class对象,但我想强制它所代表的任何类来扩展类A并实现接口B.
我可以:
Class<? extends ClassA>
要么:
Class<? extends InterfaceB>
但我不能这样做。 有没有办法做到这一点?
其实,你可以做你想做的。 如果你想提供多个接口或一个类加接口,你必须让你的通配符看起来像这样:
<T extends ClassA & InterfaceB>
请参阅sun.com上的Generics Tutorial,特别是页面底部的Bounded Type Parameters部分。 如果您愿意,您可以实际列出多个& InterfaceName
对于您需要的每个& InterfaceName
使用& InterfaceName
。
这可能会变得任意复杂。 为了演示,请参阅Collections#max
的JavaDoc声明,其中包含两行:
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>
,类名必须先出现,然后再接口。 当然,你只能列出一个班级。
你不能用“匿名”类型参数(即使用?
通配符)来完成,但你可以用“named”类型参数来完成。 只需在方法或类级别声明类型参数。
import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
T t;
}
链接地址: http://www.djcxy.com/p/70835.html