public class Base {
//long list of attributes
// no Constructor using fields
// no init methode
// i cannot change this class
}
现在,我将基类扩展为:
public class subClass extends Base{
private boolean selected;
...
getter und setter
...
}
我成为基础对象列表 List<Base>
但是我需要相同的列表,但是List<SubClass>
有没有办法从基类初始化子类?
例:
for(Base b: list){
SubClass sub = (SubClass)b; // Thats wrong i know
if(...){
sub.setSelected(true);
}
newList.add(sub);
}
我试图避免手动将基Class
类的每个属性初始化为子类
我按照评论中的要求更新了我的问题:上面的设计只是一个示例。我的QUESTIN完全是:
为什么Subclass extends BaseClass
无法将BaseClass转换为SubClass(sence )?为什么Java不允许我执行以下操作:
例:
Class Base{
private String name;
.....
}
Class SubClass extends Base{
private String title;
}
然后
Base b = DBController.getById(...);
SubClass sub = (SubClass)b;
之后,该对象sub
应具有该对象的属性名称,b
并且该title
属性为null
为什么在Java中不是这种情况?
对不起,我的英语不好,谢谢
如果您有个List<Base>
,则无法将其转换为List<SubClass>
。这主要是因为列表可能不包含的实例SubClass
。您能做的最好的事情是:
List<SubClass> newList = new List<SubClass>();
for(Base b: list){
if (b instanceof SubClass) {
SubClass sub = (SubClass)b;
. . .
newList.add(sub);
}
}
但是,通常,当您发现自己正在做这种事情时,您的设计就有问题了。您可能要避免子类化Base
,而改为使用composition。
编辑根据您的评论,听起来您想SubClass
使用Base
实例列表作为开始来构造实例列表。一种方法是定义一个SubClass
以a Base
作为参数的构造函数。
public class SubClass extends Base{
private boolean selected;
public SubClass() {
// default constructor
}
public SubClass(Base original) {
// copy constructor -- initialize some fields from
// values in original, others with default values
}
...
getter und setter
...
}
然后,您可以使用以下方法构建新列表:
List<SubClass> newList = new List<SubClass>();
for(Base b: list){
SubClass sub = new SubClass(b);
. . .
newList.add(sub);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句