考虑Java类的这一部分,
private List<Object> components = new ArrayList<Object>();
private A a;
private B b;
private C c;
add(a, b, c);
public void add(Object... component){
for(Object o : component) {
components.add((CAST)o);
}
}
我想通过良好的类型在列表中投射我的Object o。
此处的预期结果是我的列表中有A a, B b, C c
。
我尝试使用getClass(),但我没有编译。考虑到我已经知道预期的Java类型,我怎样才能改变对象?
修改
我需要添加A类型的第一个对象,类型B的第二个对象,类型C的第二个对象,...(我不知道要添加的项目数)如果列表使我将能够获得包含正确键入的N个对象的列表。 (gtt(0)将输入A,get(1)输入为B,get(2)输入为C)
因为我不知道对象的数量,而且我最初不知道对象的类型,所以我将我的列表声明为Object。
我创建了一个方法(在这种情况下为add
)。它varargs将帮助我在集合中循环,因为我不知道args的数量。
我只想在我的varargs中获取第一个对象,第二个对象和第三个对象(依此类推),并简单地将其推送到我的列表中,但不能作为对象类型,如A,B或C ,取决于我收到的东西!
我不知道它是否更清楚。
答案 0 :(得分:1)
您的列表已接受对象
private List<Object> components = new ArrayList<Object>();
为什么你需要向上转?
答案 1 :(得分:1)
首先,在这种情况下你永远无法向上转播。您真正需要向上转播的唯一地方是您访问特定于C的方法,而不是B或A;或特定于B不在A中(或在对象中都不是)
答案 2 :(得分:1)
您似乎误解了对象的运行时类型是如何工作的。当你将'A'放入List时,它不会停止成为'A'并成为一个Object。如果稍后将其取出并将其强制转换为“A”,它仍然是原始运行时类型。在将它放入列表之前,没有任何东西可以获得它。
考虑一下
Object str = "FOO";
List<Object> list = new LinkedList<Object>();
list.add(str);
String str1 = (String) list.get(0);
System.out.println(str1.length());
打印'3'。 “FOO”从未停止成为String只是因为指向它的指针的引用类型是Object。
答案 3 :(得分:1)
老实说,我同意上面的每一个人,在你给出的例子中,向上倾斜并没有多大意义。由于您声明列表将包含对象,因此从列表中检索对象时必须再次执行转换。 但是,总有一种类型比较运算符 instanceof ,您可以使用它。
public void add(Object... component){
for(Object o : component) {
if(o instanceof CAST)
components.add((CAST)o);
}
}