带类的Java泛型一个接口-一起

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

我可以:

Class<? extends ClassA>

或者:

Class<? extends InterfaceB>

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

178925 次浏览

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

<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;
}

来获得具有你想要的限制的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;
}