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(sence 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
应该从对象有属性名称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);
}
}
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)
归档时间: |
|
查看次数: |
19849 次 |
最近记录: |