模板铸造

Template casting

给定以下 class 层次结构

public class BaseClass {

}

public class ExtendedClass extends BaseClass{

}

为什么我不能将使用 baseClass 的通用 class 实例转换为使用扩展实例的相同 class 实例?
例如

List<ExtendedClass> extendedList = (List<ExtendedClass>) new LinkedList<BaseClass>();

有什么方法可以获得类似的行为,而不是强制我将第一个列表中的所有元素添加到第二个列表中。

这是被禁止的,否则你将能够做到这一点。

List<Base> base = new ArrayList<>();
List<Extended> extended = (List<Extended>)base;

base.add(new OtherExtended()); // now you have OtherExtended in List<Extended>.

你可以通过List<ExtendedClass> extendedList = (List<ExtendedClass>)(Object) new LinkedList<BaseClass>();强制编译器做你想做的事,但我建议你不要这样做。

编辑

如果你有相反的情况:

List<Extended> extended = new ArrayList<>();
List<Base> base = (List<Base>)base;

你可以做到

base.add(new OtherExtended());

遇到同样的问题。 extended 再次包含错误的对象。