多类的Java泛型通配符

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

我可以:

Class<? extends ClassA>

要么:

Class<? extends InterfaceB>

但我不能这样做。 有没有办法做到这一点?


其实,你可以做你想做的。 如果你想提供多个接口或一个类加接口,你必须让你的通配符看起来像这样:

<T extends ClassA & InterfaceB>

请参阅sun.com上的Generics Tutorial,特别是页面底部的Bounded Type Parameters部分。 如果您愿意,您可以实际列出多个& InterfaceName对于您需要的每个& InterfaceName使用& 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;
}

得到你想要的限制的variable 。 有关更多信息和示例,请参阅Java 5.0中的泛型的第3页。 请注意,在<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;
}
链接地址: http://www.djcxy.com/p/70835.html

上一篇: Java Generics Wildcarding With Multiple Classes

下一篇: iOS: sorting an NSArray of core data objects