Class X{
Class<B> object;
public setObject( Class<B> a ){....}
}
Interface B{}
Interface C extends B {}
我像这样实例化X,
X x = new X();
x.setObject( C.class );
当我构建代码时,需要Class<B>
找到Class<C>
。由于C扩展B,我可以不使用C.class吗?如果是这样,有人可以解释原因吗?
我使用Spring的基于XML的bean做同样的事情,创建它可以正常工作。 bean的定义是
<bean id="dummy" class="X">
<property name"object" value="C">
</bean>
这很好用。我不明白为什么在java中实例化会失败。
答案 0 :(得分:1)
The same way a List<Dog>
is not assignable to List<Animal>
,Class<C>
无法分配给Class<B>
,即使C
是B
的子类型。
使用XML配置,您忽略了所有类型安全规则。就好像每个参数化类型的使用都被删除一样,就像使用原始类型一样。 Class<C>
成为Class
,Class<B>
成为Class
。 Class
可分配给Class
。
答案 1 :(得分:0)
setObject(Class<B>)
未获取Class<C>
参数,这是正常的,
出于同样的原因,someMethod(List<Object>)
不会使用List<Integer>
参数:
List<Integer>
不是List<Object>
的子类,即使Integer
是Object
的子类。
要使其正常工作,您可以将方法签名更改为:
public setObject(Class<? extends B> a) {....}
答案 2 :(得分:0)
这不是有效的Java代码
它的工作原理是因为对参数&lt;&gt;
进行了类型擦除java字节码与
的字节码完全相同class X{
Class object;
public void setObject( Class a ){....}
}
interface B{}
interface C extends B {}
它丢失了类型检查信息,它仅在编译时使用。
您可以使用它来使其在代码中起作用:
class X{
Class<? extends B> object;
public void setObject( Class<? extends B> a ){....}
}
interface B{}
interface C extends B {}