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