我目前有两个我从中创建对象的类。我需要一个数组来存储这些对象的引用(指针)。该数组应该是什么类型的?
ArrayList<Class1> visableObjs = new ArrayList<Class1>();
当然只会存储指向源自Class1的对象的指针。如果我有一个来自Class2的对象,我可以将它的指针存储在同一个数组中吗?
答案 0 :(得分:1)
如果你的意思是你存储的对象是这两个类的实例,你应该让这些类继承自(自定义?)类或接口,并使用该类/接口作为存储在数组中的类型。
答案 1 :(得分:0)
我们可以这样做。如果对象来自不同的类,那就完全不好了。
ArrayList<Object> visableObjs = new ArrayList<Object>();
或
ArrayList visableObjs = new ArrayList();
答案 2 :(得分:0)
您也许可以使用泛型来创建一个Choice类来保存对一个或其他类型的引用,但不能同时包含两者:
public final class Choice<A,B> {
private final A a;
private final B b;
private final boolean isA;
private Choice(A a, B b, boolean isA) {
this.a = a; this.b = b; this.isA = isA;
}
public static <A,B> Choice<A,B> ofA(A a) {
return new Choice<>(a, null, true);
}
public static <A,B> Choice<A,B> ofB(B b) {
return new Choice<>(null, b, false);
}
public boolean isA() { return isA; }
public A getA() {
if(!isA) throw new IllegalStateException("Not a!");
return a;
}
public boolean isB() { return !isA; }
public B getB() {
if(isA) throw new IllegalStateException("Not b!");
return b;
}
// Purely for demo purposes...
public static void main(String[] args) {
Choice<Integer,String> ich = Choice.ofA(42);
Choice<Integer,String> sch = Choice.ofB("foo");
// This is why the isA is included; so we can tell a null A from a null B.
Choice<Integer,String> nil = Choice.ofA(null);
//
List<Choice<Boolean,String>> xs = new ArrayList<Choice<Boolean,String>>();
xs.add(Choice.ofA(true));
xs.add(Choice.ofB("neep"));
}
}
这适用于两个不相关的类。或者对于许多相关的子类中的两个,您希望仅限于这两种可能性 - 而不是更通用的类/接口的任何子类。
这样的类应该扩展为正确实现equals()/ hashCode(),toString()等(对于'正确'的某些定义[记录]。)
警告:这可能无法编译第一次尝试 - 我没有javac方便测试它。但这个想法应该是明确的。