java - 如何识别什么类型的自定义数组列表包含一个对象?

标签 java android object arraylist

我有一个服务器(Java)/客户端(Android)应用程序,在服务器端,根据请求,我通过 ObjectOutputStream 发送 3 种类型的对象。

对象类型如下:

在java服务器端:

//My serializable classA
MySerializableClassA classA = MySerializableClassA(A, B, C);
out.WriteObject(classA);

//Arraylist of my serializable classB
ArrayList<MySerializableClassB> classB = new ArrayList<MySerializableClassB>();
classB.add(new MySerializableClassB(E, F, G, H));
out.writeObject(classB);

//Arraylist of my serializable classC
ArrayList<MySerializableClassC> classC = new ArrayList<MySerializableClassC>();
classC.add(new MySerializableClassC(Y, X, Z));
out.writeObject(classC);

Android 客户端:

Object obj
private MySerializableClassA classA;
private ArrayList<MySerializableClassB> arrayClassB;
private ArrayList<MySerializableClassC> arrayClassC;

//Here i get the object received, i store it in a Object
in = new ObjectInputStream(_socket.getInputStream());
obj = in.readObject();

//And I check of which class is an instance
if(obj instanceof MySerializableClassA){
    classA = (MySerializableClassA)obj;
    //Do a specific action
}

问题从这里开始,因为未检查从 Object 到 ArrayList 的转换,

//I check if object is instanceof ArrayList...
else if(obj instanceof ArrayList){
    //and here a need to identify the type of the object inside the arraylist , so... 
    if(the object inside is an instanceof MySerializableClassB){
        arrayClassB = (ArrayList<MySerializableClassB>)obj;
        //Do a specific action
    }
    else if(the object inside is an instanceof MySerializableClassC){ 
        arrayClassC = (ArrayList<MySerializableClassC>)obj;
        //Do a specific action
    }
}

所以我的问题是: 有什么方法可以识别什么类型的 costum arraylist 包含我的对象? 或者在这种情况下确定什么类型的对象包含我的数组列表?

我也可以选择将 classB 和 classC 合并到一个类中……但如果我能按照上面的要求做,那就更好了。

欢迎任何帮助或建议以其他方式做我想做的事,谢谢。

最佳答案

您面临的问题称为 type erasure .在运行时,无法辨别 List<A>来自 List<B> .您可以通过使用类似方法将列表包装到对象中来解决它

Class<T> getItemType();

或者创建两个不同的 ArrayList 子类然后使用 getActualTypeArguments() .第二种选择会很奇怪。

如果您的用例允许,最简单的方法是遍历列表并为每个项目做出决定。检查对每个项目产生相同的结果应该无关紧要。

将列表包装到携带项目类型的对象中会向流中添加一些元数据。如果您想避免创建该包装器,您可以在每个列表之前手动将类型写入流,从而定义自定义协议(protocol)。如果你走那条路,考虑protobuf或类似的。

关于java - 如何识别什么类型的自定义数组列表包含一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15461529/

相关文章:

java - WAR 部署上的 Groovy Grails 工具套件 NoClassDefFoundError

Java SecureRandom 作为盐

java - 我怎样才能使这个 rxjava zip 并行运行?

arrays - 仅在 freemarker 中创建 "object"(无 JAVA 等)?

javascript - 如何在Reactjs中显示对象内数组的内容

java - 是否可以使用仅在使用此枚举时定义的变量创建枚举?

java - 使用 Com4j API 添加附件到 QC 测试用例时出现问题

java - 延迟后转发jsp页面

android - 在 AppCompat 21 中使用 Light.DarkActionBar 主题更改 ActionBar 标题文本颜色

java - 软输入布局没有按预期改变