我想要一个 Class 对象,但我想强制它代表的任何类扩展类 A 并实现接口 B。
我可以:
Class<? extends ClassA>
或者:
Class<? extends InterfaceB>
但我不能两者都做。有没有办法做到这一点?
我想要一个 Class 对象,但我想强制它代表的任何类扩展类 A 并实现接口 B。
我可以:
Class<? extends ClassA>
或者:
Class<? extends InterfaceB>
但我不能两者都做。有没有办法做到这一点?
其实,你可以为所欲为。如果你想提供多个接口或一个类加接口,你必须让你的通配符看起来像这样:
<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>
,类名必须在前,接口在后。当然,您只能列出一个类。
您不能使用“匿名”类型参数(即使用 的通配符?
)来执行此操作,但您可以使用“命名”类型参数来执行此操作。只需在方法或类级别声明类型参数。
import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
T t;
}
这是你在 Kotlin 中的做法
fun <T> myMethod(item: T) where T : ClassA, T : InterfaceB {
//your code here
}