首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从子/子/继承类获取基类/父类/超类

从子/子/继承类获取基类/父类/超类
EN

Stack Overflow用户
提问于 2013-03-17 22:10:23
回答 4查看 371关注 0票数 2

我正在尝试通过套接字发送对象列表。

列表中的对象包含一个不可序列化的对象,因此无法发送,但是它的基类是完全可序列化的,并且包含我需要的所有字段。

所以我要做的就是把列表转换成基类的列表。我认为唯一能做到这一点的方法是:

代码语言:javascript
复制
// subClassList is an ArrayList<SubClass>
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add((BaseClass)subClass);
}

然而,这不起作用,因为我仍然得到相同的NotSerializableException异常。通过调试代码,我可以看到新的列表仍然是子类的列表,即使它已经被强制转换。

有没有办法实现我想要做的事情?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-17 22:14:45

强制转换引用不会更改实际对象的类型:

代码语言:javascript
复制
String foo = "hello";
Object bar = (Object) foo;
System.out.println(bar); // Hello
System.out.println(bar.getClass()); // java.lang.String

如果你只想拥有基类的一个实例,你可以在基类中创建一个构造函数,它只是在给定基类的一个实例的情况下创建一个新的基类实例,而不是试图执行任何类型的深度复制:

代码语言:javascript
复制
public BaseClass(BaseClass other) {
    this.x = other.x;
    this.y = other.y;
    this.z = other.z;
    // etc
}

然后在您所展示的代码中:

代码语言:javascript
复制
baseClass.add(new BaseClass(subClass));
票数 1
EN

Stack Overflow用户

发布于 2013-03-17 22:16:44

您的方法不起作用,因为即使您可以使用超类变量来引用子类对象,对象本身也是子类类型。

最好的方法是序列化子类,或者从子类中提取数据并将其写入新创建的超类。只需使用一个静态实用程序方法将转换构建到子类中即可。

票数 0
EN

Stack Overflow用户

发布于 2013-03-17 22:17:04

强制转换不会更改对象的类型。它允许获取该对象的另一种类型的引用,只要该对象具有该另一种类型。向上转换从来都不是必要的。您可以使用

代码语言:javascript
复制
String s = "hello";
Object o = s; // no cast needed

向下转换是必要的,并且仅当对象具有您将其强制转换为的类型时才有效:

代码语言:javascript
复制
Object o = "hello";
Object o2 = Integer.valueOf(5);
String s = (String) o; // OK because o is a String
String s2 = (String) o2; // ClassCastException, because o2 is not a String.

因此,您的代码等同于

代码语言:javascript
复制
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add(subClass);
}

必须使用复制构造函数创建新类型的新对象:

代码语言:javascript
复制
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>();
for(SubClass subClass: subClassList) {
    // cast to the base class
    baseClassList.add(new BaseClass(subClass));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15461667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档