一尘不染

具有多个类的Java泛型通配符

java

我想拥有一个Class对象,但是我想强迫它代表的任何类扩展A类并实现接口B。

我可以:

Class<? extends ClassA>

要么:

Class<? extends InterfaceB>

但我不能两者都做。有没有办法做到这一点?


阅读 398

收藏
2020-03-02

共1个答案

一尘不染

实际上,你可以做你想做的事。如果要提供多个接口或一个类加接口,则必须使通配符看起来像这样:

<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>,类名必须排在最前面,然后是接口。当然,你只能列出一个班级。

2020-03-02