Java中不丢失数据的继承
我可以将所有继承的对象存储为ArrayList吗?我不想为每种对象类型创建新的ArrayList,例如:Java中不丢失数据的继承,java,Java,我可以将所有继承的对象存储为ArrayList吗?我不想为每种对象类型创建新的ArrayList,例如: ArrayList<MyObjectTypeA> ArrayList<MyObjectTypeB> ArrayList<MyObjectTypeC> ArrayList ArrayList ArrayList 我知道我能做到: ArrayList<Object> 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创建新的列表吗