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
到子类
我按照评论中的要求更新了我的问题: 上面的设计只是一个例子。我的问题是:
为什么不能将 BaseClass 转换为 SubClass(来自 Subclass extends BaseClass
)?为什么 Java 不允许我执行以下操作:
例子:
Class Base{
private String name;
.....
}
Class SubClass extends Base{
private String title;
}
然后
Base b = DBController.getById(...);
SubClass sub = (SubClass)b;
之后对象 sub
应具有来自对象的属性名称 b
和 title
属性为空
为什么在 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 instead .
编辑 根据您的评论,听起来您想构建一个 SubClass
的列表使用 Base
列表的实例实例作为开始。一种方法是为 SubClass
定义构造函数这需要 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);
}
关于java,从父类(super class)初始化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802290/