我们可以将包含超类对象的向量转换为包含子类对象的向量吗?
Can we cast a vector containing superclass Objects into a vector containing subclass Objects?
我有两个这样的向量:
Vector<Animal> vAM = new Vector<Animal>();
Vector<Cat> vCat = new Vector<Cat>();
是否可以将 vAM
向量转换为 vCat
向量?如果没有,那应该怎么做?
更新: 我提到这个的原因是我的代码中有一个特定的转换,它不会抛出编译时异常,但会抛出 运行 时间例外 。因此,我想知道是否有任何其他方法可以做到这一点。
是的,您可以使用直接转换。但我不建议这样做,因为并非每个 animal
都可以是 cat
。这将导致 ClassCastExcpetions
.
我不明白有必要做这个转换,所以我认为最好重新考虑一下你的程序设计。
您想到的转换只是一个编译时工件:您希望编译器将静态类型 Vector<Animal>
的表达式重新解释为类型 Vector<Cat>
的表达式。这种重新解释违反了静态类型安全,这就是它导致编译器错误的原因。
如果您确实需要这样做,例如由于您正在使用的第 3 方 API 中存在一些不匹配,有一种绕过编译器检查的方法,但您仍然需要@SuppressWarnings
:
vCat = (Vector<Cat>)(Vector)vAM;
请注意,这样做会使编译器失去 vAM
实际上只包含猫的保证。
我有两个这样的向量:
Vector<Animal> vAM = new Vector<Animal>();
Vector<Cat> vCat = new Vector<Cat>();
是否可以将 vAM
向量转换为 vCat
向量?如果没有,那应该怎么做?
更新: 我提到这个的原因是我的代码中有一个特定的转换,它不会抛出编译时异常,但会抛出 运行 时间例外 。因此,我想知道是否有任何其他方法可以做到这一点。
是的,您可以使用直接转换。但我不建议这样做,因为并非每个 animal
都可以是 cat
。这将导致 ClassCastExcpetions
.
我不明白有必要做这个转换,所以我认为最好重新考虑一下你的程序设计。
您想到的转换只是一个编译时工件:您希望编译器将静态类型 Vector<Animal>
的表达式重新解释为类型 Vector<Cat>
的表达式。这种重新解释违反了静态类型安全,这就是它导致编译器错误的原因。
如果您确实需要这样做,例如由于您正在使用的第 3 方 API 中存在一些不匹配,有一种绕过编译器检查的方法,但您仍然需要@SuppressWarnings
:
vCat = (Vector<Cat>)(Vector)vAM;
请注意,这样做会使编译器失去 vAM
实际上只包含猫的保证。