Java 泛型与类和接口(interface) - 一起

标签 java class generics bounded-wildcard

我想要一个 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/

相关文章:

c++ - 如何为 C++ 类设置 bool 值?

java - list 文件不是通过 ANT 生成的

javascript - 在 JavaScript(ES6) 的构造函数链中调用被子函数覆盖的父函数

java - 从 Java 创 build 备驱动程序包

c++ - 如何取消初始化 C++ 中的对象?

c# - 为什么这个泛型在编译时没有解析?

c# - 如何声明作为通用参数提供的通用值类型的 const 字段

java - 如何使用泛型在抽象类中注入(inject)服务

java - 为什么我的程序说整数对于 Project Euler #3 (Java) 来说太大了?

java - 如何重写子类的equals方法