1

考虑到 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 的数量。

我只想在我的可变参数中获取第一个对象、第二个对象和第三个对象(依此类推),并将其简单地推送到我的列表中,但不是作为对象类型,如 A、B 或 C,取决于我收到了什么!

我不知道它是否更清楚。

4

4 回答 4

1

您的列表已经接受对象

private List<Object> components = new ArrayList<Object>();

为什么你需要向上转型?

于 2012-06-19T22:10:12.797 回答
1

首先,在这种情况下,你永远不能上当。您真正需要向上转换的唯一地方是当您访问特定于 C 的方法时,而不是在 B 或 A 中;或特定于不在 A 中的 B。(或不在 Object 中)

于 2012-06-19T22:11:42.567 回答
1

您似乎误解了对象的运行时类型是如何工作的。当您将“A”放入列表时,它不会停止成为“A”并成为对象。如果您稍后将其取出并将其转换回“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”从未停止成为字符串,因为指向它的指针的引用类型是对象。

于 2012-06-19T22:30:22.453 回答
1

老实说,我同意以上所有人的观点,在您给出的示例中向上转换没有多大意义。由于您声明列表将包含对象,因此在从列表中检索对象时必须再次进行强制转换。但是,总有可以使用的类型比较运算符instanceof 。

public void add(Object... component){
    for(Object o : component) {
        if(o instanceof CAST)
            components.add((CAST)o);
    }
}
于 2012-06-19T22:30:45.460 回答