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

4

3 回答 3

1

同样的方式 aList<Dog>不能分配给List<Animal>Class<C>也不能分配给Class<B>,即使C是 的子类型B

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

于 2014-10-31T23:18:17.160 回答
0

setObject(Class<B>)不带参数是正常的,原因与不带参数Class<C>的原因相同: 不是 的子类,即使是 的子类。someMethod(List<Object>)List<Integer>List<Integer>List<Object>IntegerObject

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

public setObject(Class<? extends B> a) {....}
于 2014-10-31T23:19:05.303 回答
0

这不是有效的 Java 代码

它之所以有效,是因为对参数 <> 进行了类型擦除

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 {}
于 2014-10-31T23:19:11.713 回答