【发布时间】:2013-07-12 19:41:15
【问题描述】:
我不确定这是否可能,但我想要完成的是:
public static <A,B extends SomeClass & A> B makeB(A thing) {...}
基本上,使用反射/生成驱动的过程,我想提供 B 类型的东西,其中 B 属于 SomeClass 类并实现接口 A,而 A 是用户通过泛型提供的。
我不是在询问生成 B 的机制——我已经控制了它。我正在寻找一种将泛型类型参数<A> 限制为接口而不是类的方法,以便我可以使用语法B extends SomeClass & A 来实现干净的类型安全。
这可能吗?有人知道解决此问题的替代方法吗?
编辑:我想我表达的不是很清楚,因为它似乎在 cmets 中引起了混乱:
B 旨在作为通配符的占位符,以便客户端可以获得一个既是 SomeClass 又是 A 的对象,而无需基于信任进行强制转换。客户端将无法访问实现SomeClass 和A 的实际类的名称,因为它是在编译时生成的,因此存在关于类型安全的问题。
【问题讨论】:
-
不,不可能。
-
这让我一脸悲伤:(
-
另一方面,如果你想要一个反射驱动的东西,你可以传递一个
Class<A>并显式调用Class.isInterface()。 -
@LouisWasserman 他已经有一个 A 的实例作为参数。他可以从中获得 Class 。他不需要其他参数。
-
@jahroy 抱歉,直到您删除答案后,我才有机会看到您对我的评论。你关于推断
B的观点是绝对正确的——我实际上在编辑我的答案时提到了类似的问题。您绝对应该取消删除您的答案,因为它很有帮助。