Java Generics With a Class & an Interface - Together
2022-08-31 04:35:24
我想要一个 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
这可能会变得任意复杂。为了演示,请参阅 Collections#max
的 JavaDoc 声明,该声明(换行到两行上)是:
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;
}
以获得您想要的限制。有关更多信息和示例,请查看 Java 5.0 中的泛型的第 3 页。请注意,在 中,类名必须排在第一位,接口必须排在后面。当然,您只能列出一个类。variable
<T extends B & C>
你不能用“匿名”类型参数(即,使用的通配符)来做,但你可以用“named”类型参数来做。只需在方法或类级别声明类型参数即可。?
import java.util.List;
interface A{}
interface B{}
public class Test<E extends B & A, T extends List<E>> {
T t;
}