例如我有:
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方法,我应该如何使用上述方法的返回类型? 感谢。
答案 0 :(得分:5)
这两个类都是Serializable,但Serializable没有定义任何方法。
您需要自己定义包含getA()方法的基类或接口,然后您可以使用它来引用它们。
请记住,虽然在这种情况下,您拥有的唯一可序列化类是Class1
和Class2
,但在大多数情况下,您无法保证这一点。可能有另一个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