2017-04-20 195 views
1

我有应该接收到一个Class<A>,类似的方法:传递Child.class作为参数

protected void method(final Class<A> clazz) { 
} 

然后,当我试图像method(A.class)叫它做的工作,但如果我尝试method(B.class),其中B是子女A,我收到消息“不兼容的类型”。

解决的办法是改变Class<B>,但我还有一个孩子的,我喜欢作为参数传递给这个method(),像C.class

+3

相关:[是列表列表的子类?为什么不是Java的泛型隐含多态?](http://stackoverflow.com/q/2745265) – Pshemo

回答

5

一个解决方案是限定参数时使用有界通配符:

protected void method(final Class<? extends A> clazz) { 
    // Code here... 
} 

由此,你被允许通过直接A的类或从A延伸的任何类。

或者为帕夫洛·建议:

protected <T extends A> void method(final Class<T> clazz) { 
    // Code here... 
} 

双方将工作,但将有助于了解您打算如何处理clazz这样做,我们可以选择一个比其他。

+4

我会建议使用'protected void方法(final Class clazz)''会事件变好,因为当你尝试调用'clazz'上的方法时,它可以避免通配符混乱。 –

+0

@PavloViazovskyy你指的是什么泛型混乱?所有你可以在类“”上调用的是生产者方法; (例如)'A instance = clazz.getInstance();'。 –

+0

@AndyTurner。你是对的。这是我的错误。由于'Class'没有使用消费者方法(以'T'作为参数),所以使用_Jacob_最初建议的通配符版本就足够了。 –