模板铸造
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
再次包含错误的对象。
给定以下 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
再次包含错误的对象。