我想要一个类对象,但我想强制它所代表的任何类扩展类a并实现接口B.

我能做到:

Class<? extends ClassA>

或者:

Class<? extends InterfaceB>

但我不能两者兼得.有办法做到这一点吗?

推荐答案

事实上,你想怎么做就怎么做.如果你想提供多个接口或一个类加接口,你必须让你的通配符看起来像这样:

<T extends ClassA & InterfaceB>

请参阅sun.com上的Generics Tutorial,特别是页面底部的Bounded Type Parameters部分.如果愿意,您实际上可以列出多个接口,您需要的每个接口都使用& InterfaceName.

这可能会变得任意复杂.要进行演示,请参阅JavaDoc声明Collections#max,它(换成两行)是:

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

为什么这么复杂?正如Java Generics常见问题解答中所说:To preserve binary compatibility.

这似乎不适用于变量声明,但在类上放置泛型边界时确实有效.因此,要想做你想做的事,你可能需要跳过几圈.但你可以做到.您可以这样做,在类上设置一个通用边界,然后:

class classB { }
interface interfaceC { }

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

才能得到有你想要的限制的variable.有关更多信息和示例,请查看第3页(共Generics in Java 5.0页).请注意,在<T extends B & C>中,类名必须在前面,接口在后面.当然,你只能列出一个班级.

Java相关问答推荐

Collections.binarySearch()使用Collections.reverseOrder()作为比较器返回-1

Maven Google Sheets版本问题

当我用OkHttpClient重写shouldInterceptRequest来发布数据时,Android WebView正在以纯HTML加载URL内容

H2弹簧靴试验跌落台

将成为一个比较者.比较…在现代Java中,编译器会对`CompareTo`方法进行优化吗?

无法在WebSocket onMessage中捕获错误

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

为什么JAVA&S清洁器使用链表而不是并发HashSet?

Kotlin内联互操作:强制装箱

如何在Java中从XML中获取特定的 node ,然后将其删除?

将响应转换为带值的键

Spring Security不允许加载js

Jolt变换JSON数组问题

声明带有泛型的函数以用作查找映射中的值

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

如何在Jooq中获取临时表列引用?

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

Java类型推断:为什么要编译它?

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)