Java中不丢失数据的继承

Java中不丢失数据的继承,java,Java,我可以将所有继承的对象存储为ArrayList吗?我不想为每种对象类型创建新的ArrayList,例如: ArrayList<MyObjectTypeA> ArrayList<MyObjectTypeB> ArrayList<MyObjectTypeC> ArrayList ArrayList ArrayList 我知道我能做到: ArrayList<Object> ArrayList 然后将其强制转换为有效的对象类型,但可能有更快、性能更

我可以将所有继承的对象存储为ArrayList吗?我不想为每种对象类型创建新的ArrayList,例如:

ArrayList<MyObjectTypeA>
ArrayList<MyObjectTypeB>
ArrayList<MyObjectTypeC>
ArrayList
ArrayList
ArrayList
我知道我能做到:

ArrayList<Object>
ArrayList
然后将其强制转换为有效的对象类型,但可能有更快、性能更高的方法来执行此操作,如:

ArrayList<MyObject>
ArrayList

并将其强制转换为有效的对象类型,我会丢失其他对象类型数据还是强制转换会将其恢复为我的类型?

如果
MyObjectTypeA
和其他继承自
MyObject
,那么您确实可以创建一个
ArrayList
并存储所有对象,然后将它们强制转换回正确的对象类型

但是,请注意,这是一种反模式,通常有一种坏代码的味道。只有当您想使用任何类型的
MyObject
时,才应该这样做。如果要使用特定类型,则应创建不同的
List
s

无论如何,如果要将它们捆绑在一个列表中,至少在进行任何转换之前,您应该检查您正在转换的对象是否是您正在转换的类型的实例,以便:

if (object instanceof MyObjectTypeA){
  MyObjectTypeA typeA = (MyObjectTypeA) object;
} else if (object instanceof MyObjectTypeB) {
  // etc.
}
请注意,投射的过程不会改变对象本身。这就是为什么正确的命名是类型转换。实际上,您声明实例不是特定类型的实例。这本质上是“启用”特定类型的方法和成员的使用,而以前它们在那里,但由于编译器不知道它们,因此无法访问(因为他认为对象的类型不包含这些成员,而是包含在程序内存中)

举个例子,如果你这样作弊:

MyObjectTypeA typeA = new MyObjectTypeA();
MyObject object = (MyObject) typeA;
MyObjectTypeB typeB = (MyObjectTypeB) object;

这实际上会编译,因为编译器知道
object
可以是
MyObjectTypeB
类型,但它会警告您正在执行未经检查的强制转换(而不是像我前面显示的那样,使用
instanceof
进行检查)。这个具体的场景,,当到达第3行时,将抛出一个
ClassCastException
,因为解释器将尝试将
object
转换为
MyObjectTypeB
,但将失败,因为
object
的类型是
MyObjectTypeB

,如果
MyObjectTypeA
和其余继承自
MyObject
,那么您确实可以创建创建一个
ArrayList
,并存储所有对象,然后将它们转换回正确的对象类型

但是,请注意,这是一种反模式,通常有一种坏代码的味道。只有当您想使用任何类型的
MyObject
时,才应该这样做。如果要使用特定类型,则应创建不同的
List
s

无论如何,如果要将它们捆绑在一个列表中,至少在进行任何转换之前,您应该检查您正在转换的对象是否是您正在转换的类型的实例,以便:

if (object instanceof MyObjectTypeA){
  MyObjectTypeA typeA = (MyObjectTypeA) object;
} else if (object instanceof MyObjectTypeB) {
  // etc.
}
请注意,投射的过程不会改变对象本身。这就是为什么正确的命名是类型转换。实际上,您声明实例不是特定类型的实例。这本质上是“启用”特定类型的方法和成员的使用,而以前它们在那里,但由于编译器不知道它们,因此无法访问(因为他认为对象的类型不包含这些成员,而是包含在程序内存中)

举个例子,如果你这样作弊:

MyObjectTypeA typeA = new MyObjectTypeA();
MyObject object = (MyObject) typeA;
MyObjectTypeB typeB = (MyObjectTypeB) object;

这实际上会编译,因为编译器知道
object
可以是
MyObjectTypeB
类型,但它会警告您正在执行未经检查的强制转换(而不是像我前面显示的那样,使用
instanceof
进行检查)。这个具体的场景,,当到达第3行时,将抛出一个
ClassCastException
,因为解释器将尝试将
object
强制转换为
MyObjectTypeB
,但将失败,因为
object
属于类型
MyObjectTypeB

,您可以声明一个类型基类的arraylist,并向其中添加继承类型的对象。
ArrayList

您可以声明基类类型的ArrayList,并向其中添加继承类型的对象。
ArrayList
为什么不使用
HashMap
并将对象存储为值,将键存储为类型

HashMap<Type, Object> typeObjectMap = new HashMap<Type, Object>();
HashMap-typeObjectMap=newhashmap();

为什么不使用
HashMap
并将对象存储为值,将键存储为类型

HashMap<Type, Object> typeObjectMap = new HashMap<Type, Object>();
HashMap-typeObjectMap=newhashmap();

您需要清楚地定义对象

例如,如果您有一个类
a
,而类
B
C
继承自
a
,则选择“是”,执行以下操作:

ArrayList<A> temp= new ArrayList<A>;
ArrayList temp=新的ArrayList;
在这里,您可以使用多态性调用所需的方法


您还应该了解类型安全和类型转换。对象类太通用。

您需要清楚地定义对象

例如,如果您有一个类
a
,而类
B
C
继承自
a
,则选择“是”,执行以下操作:

ArrayList<A> temp= new ArrayList<A>;
ArrayList temp=新的ArrayList;
在这里,您可以使用多态性调用所需的方法


您还应该了解类型安全和类型转换。对象类太泛型。

在ArrayList中?当我将其转换回时,它不会丢失额外的子类型数据?是否让您的类型实现一个类似的接口,然后使用的实例获取您想要的ArrayList中的特定类型?当我回传时,它不会丢失额外的子类型数据?让你的类型实现一个类似的接口,然后使用的实例来获取你想要的特定类型,比如我的应用程序的服务器,那么我应该为新的请求类型和ma创建新的列表吗