考虑到我已经知道预期的Java类型,我该如何转换对象?

时间:2012-06-19 22:08:35

标签: java casting

考虑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 ,取决于我收到的东西!

我不知道它是否更清楚。

4 个答案:

答案 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);
    }
}