实现java.io.Serializable的两种类型的Arraylist

时间:2014-03-27 16:38:54

标签: java serializable

例如我有:

    public class Class1 implements Serializable {
       private static final long serialVersionUID = 1L;
       private int a;
       private int b;

       /*Getters and setters here*/
       public int getA();
    }

    public class Class2 implements Serializable {
       private static final long serialVersionUID = 1L;
       private int a;
       private int b;

       /*Getters and setters here*/
       public int getA();
    }

现在我想制作这两种类型的ArrayList。这就是我正在尝试的:

List<Serializable> list= new ArrayList<Serializable>();

我有一个返回Serializable的方法,它返回列表中的对象:

  public Serializable get(int i)
{
    return list.get(i);
}

但是,当我尝试使用上面两个类中的getter方法(类似于list.get(0).getA())时,会出现一个错误,说getA()方法没有为Serializable定义。我错过了一些简单的东西吗?为了使用getter方法,我应该如何使用上述方法的返回类型? 感谢。

7 个答案:

答案 0 :(得分:5)

这两个类都是Serializable,但Serializable没有定义任何方法。

您需要自己定义包含getA()方法的基类或接口,然后您可以使用它来引用它们。

请记住,虽然在这种情况下,您拥有的唯一可序列化类是Class1Class2,但在大多数情况下,您无法保证这一点。可能有另一个Class3实现Serializable但没有方法getA

答案 1 :(得分:3)

您正在返回Serializable个对象,而不是Class1个对象。有两种方法可以做到这一点,但我推荐后者:

Serializable s = list.get(1);
if (s instanceof Class1) {
    Class1 clazz = (Class1) s;
    clazz.getA();
} //etc...

或者,使用通用界面:

public interface YourClass extends Serializable {

    public int getA();

}

//...

List<YourClass> list = new ArrayList<>();

答案 2 :(得分:1)

此方法使用具有名为getA()的方法的接口。如果两个类都实现了此接口,则可以从接口类型的List中调用该方法。

 public interface MyInterface {
      public void getA();
    }

 public class Class1 implements MyInterface, Serializable {
       private static final long serialVersionUID = 1L;
       private int a;
       private int b;

       /*Getters and setters here*/
       public int getA();
    }

    public class Class2 implements MyInterface, Serializable  {
       private static final long serialVersionUID = 1L;
       private int a;
       private int b;

       /*Getters and setters here*/
       public int getA();
    }

    List<MyInterface> list= new ArrayList<MyInterface>();

这样你就可以list.get(0).getA();

答案 3 :(得分:0)

Java中的Serializable接口没有任何方法,它只是一个标记接口。 如果你想拥有一个通用的方法,你应该用getA()创建另一个接口,而不是在你的两个类中实现这个接口。

答案 4 :(得分:0)

您应该创建一个包含方法getA()的接口。 您的列表应该将您的界面设置为通用类型。

public interface MyInterface
{
  public int getA();
}

public class Class1 implements MyInterface
{
  public int getA()
  {
    // Your implementation of getA()
    return 0;
  }
}

现在在代码中创建一个类型为Class1的对象,并将该对象放入一个通用类型MyInterface的List中:

List<MyInterface> myList = new ArrayList<MyInterface>();

Class1 obj1 = new Class1();
Class1 obj2 = new Class1();

myList.add(obj1);
myList.add(obj2);

现在你可以迭代你的列表并获得MyInterface类型的对象(而不是Serializable),这样你就可以在对象上调用方法getA。

答案 5 :(得分:0)

创建一个接口,声明所有类共有的方法。

interface A extends Serializable {
   public int getA();
}

public class Class1 implements A {
   private static final long serialVersionUID = 1L;
   private int a;
   private int b;

   /*Getters and setters here*/
   public int getA();
}

public class Class2 implements A {
   private static final long serialVersionUID = 1L;
   private int a;
   private int b;

   /*Getters and setters here*/
   public int getA();
}

然后声明一个A的列表:

List<A> mylist = new ArrayList<A>();

如果你愿意,你可以做你的方法(但它没有增加太多):

public Serializable get(int i) {
   return mylist.get(i);
}

mylist被声明为具有全部实现getA()方法的A对象。

答案 6 :(得分:0)

 Try this...

 List<Class1> list= new ArrayList<Class1>();
    Class1 c = new Class1();
    c.setA(2);
    c.setB(4);
    list.add(c);
    System.out.println(list.get(0).getA());

这将打印2

List<Serializable> list2= new ArrayList<Serializable>();
list2.add(c);
System.out.println(((Class1)list2.get(0)).getA());

这也将打印2