Spring xml vs java config中的类类型注入

时间:2014-10-31 23:04:08

标签: java xml spring spring-java-config spring-ioc

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中实例化会失败。

3 个答案:

答案 0 :(得分:1)

The same way a List<Dog> is not assignable to List<Animal>Class<C>无法分配给Class<B>,即使CB的子类型。

使用XML配置,您忽略了所有类型安全规则。就好像每个参数化类型的使用都被删除一样,就像使用原始类型一样。 Class<C>成为ClassClass<B>成为ClassClass可分配给Class

答案 1 :(得分:0)

setObject(Class<B>)未获取Class<C>参数,这是正常的, 出于同样的原因,someMethod(List<Object>)不会使用List<Integer>参数: List<Integer>不是List<Object>的子类,即使IntegerObject的子类。

要使其正常工作,您可以将方法签名更改为:

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