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

Java Generics Wildcarding With Multiple Classes

我想要一个类对象,但是我想要强制它所代表的任何类来扩展类A和实现接口B。

我能做到:

1
Class<? extends ClassA>

或:

1
Class<? extends InterfaceB>

但我不能两者兼得。有办法吗?


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

1
<T extends ClassA & InterfaceB>

请参阅sun.com上的generics教程,特别是页面底部的绑定类型参数部分。如果您愿意的话,您实际上可以列出多个接口,为您需要的每个接口使用& InterfaceName

这会变得任意复杂。要演示,请参见Collections#max的javadoc声明,它(包装在两行中)是:

1
2
public static <T extends Object & Comparable<? super T>> T
                                           max(Collection<? extends T> coll)

为什么这么复杂?正如Java泛型常见问题解答:保存二进制兼容性。

看起来这对变量声明不起作用,但在类上放置泛型边界时,它起作用。因此,要想做你想做的事,你可能需要跳过几个圈。但你可以做到。您可以这样做,在类上放置一个通用边界,然后:

1
2
3
4
5
6
class classB { }
interface interfaceC { }

public class MyClass<T extends classB & interfaceC> {
    Class<T> variable;
}

得到有你想要的限制的variable。有关更多信息和示例,请查看Java 5中泛型的第3页。注意,在中,类名必须在前面,接口在后面。当然,你只能列出一个类。


不能使用"匿名"类型参数(即使用?的通配符),但可以使用"命名"类型参数。只需在方法或类级别声明类型参数。

1
2
3
4
5
6
import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
    T t;
}