java,从SuperClass初始化SubClass

Ram*_*i.Q 11 java extends initialization subclass superclass

public class Base {
  //long list of attributes
  // no Constructor using fields
  // no init methode 
  // i cannot change this class
}
Run Code Online (Sandbox Code Playgroud)

现在我扩展了基类,如:

public class subClass extends Base{
   private boolean selected;

   ...
   getter und setter
   ...
}
Run Code Online (Sandbox Code Playgroud)

我成为Base对象的列表 List<Base>

但我需要相同的列表,但List<SubClass> 有没有办法从基类初始化子类?

例:

for(Base b: list){
   SubClass sub = (SubClass)b; // Thats wrong i know
   if(...){
       sub.setSelected(true);
   }
   newList.add(sub);
}
Run Code Online (Sandbox Code Playgroud)

我试图避免Class对SubClass 的每个Base属性的手动初始化

我按照评论中的要求更新我的问题:上面的设计只是一个例子.我的QUESTIN确实是:

为什么将BaseClass转换为SubClass(s​​ence Subclass extends BaseClass)是不可能的?为什么Java不允许我做以下事情:

例:

Class Base{
   private String name;
.....
}
Class SubClass extends Base{
   private String title;
}
Run Code Online (Sandbox Code Playgroud)

然后

Base b = DBController.getById(...);
SubClass sub = (SubClass)b; 
Run Code Online (Sandbox Code Playgroud)

之后的对象sub应该从对象有属性名称btitle属性为null

为什么这不是java中的情况?

抱歉我的英语不好,谢谢

Ted*_*opp 7

如果你有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,一般来说,当你发现自己正在做这种事情时,你的设计就会出现问题.您可能希望避免Base使用子类化和使用组合.

编辑根据您的评论,听起来您想要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
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下内容构建新列表:

List<SubClass> newList = new List<SubClass>();
for(Base b: list){
    SubClass sub = new SubClass(b);
    . . .
    newList.add(sub);
}
Run Code Online (Sandbox Code Playgroud)