我想拥有一个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>
,类名必须排在最前面,然后是接口。当然,你只能列出一个班级。
问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去
在试图理解java泛型类型和通配符“?”的用法时,我尝试了以下方法: 我得到以下编译错误(使用Oracle JDeveloper作为IDE): 为什么上面的代码不能编译,而赋值却可以呢?另外,如果我想调用,什么是可接受的参数值?
它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规
编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷
根据Joshua Bloch的“有效Java”一书,关于如何/何时在泛型中使用有界通配符有一个规则。这个规则就是PECS(productor-extends,Comsumer-Super)。当我研究以下示例时: 根据PECS规则,上述声明是错误的。但是我希望有一个的,并向这个传递一个。为什么不做呢? 为什么要始终使用关键字?为什么使用是错误的? 当然,这也代表了Comsumer的观点。为什么消费者
我正在与Java8通配符泛型作斗争。 假设一个名为的泛型类(来自Core Java book) 是因为Java8编译器转换吗?超级经理反对,因此任何事情都是允许的?