将对象转换为ArrayList<String>

8

是否可以将一个Object转换为例如ArrayList<String>?

下面的代码给出了问题的示例。问题在最后一行。

setDocs((ArrayList<Document>)obj);

我想把一个 Object obj 转换为 ArrayList<String>

public void setValue(Object obj)
    {
        if(obj instanceof TFile)
            setTFile((TFile)obj);
        else
            if(obj instanceof File)
                setFile((File)obj));
            else
                if(obj instanceof Document)
                    setDoc((Document)obj);
                else
                    if(obj instanceof ArrayList)
                        setDocs((ArrayList<Document>)obj);

    }

2
什么问题?你遇到了什么错误? - Vincent van der Weele
你说想将一个对象 obj 强制转换为 ArrayList<String>,但是在最后一行你似乎将其转换为了 ArrayList<Document> - codeMan
我写的是ArrayList<String>,但你是对的,类型应该是Document。 - padre
请注意,这里会有很多"else if",而不是像在Python或其他关注缩进和行的语言中那样写成"if(){}else{}"。但我认为实际结果不会有所不同。 - spydon
2个回答

10
在Java中,泛型并不会被实体化,即在强制转换时它们的泛型类型不会被使用。
因此,以下代码:
setDocs((ArrayList<Document>)obj);

将会被执行为

setDocs((ArrayList)obj);

因为运行时转换不会检查您的ArrayList是否包含Document对象,所以编译器会引发警告。


1
我明白了...那么有什么重新编写该方法的建议吗?我应该将该方法也变成通用的,这样会起作用吗? - padre
只要你需要强制转换,就会出现这个问题。你可以忽略编译器的警告,或者在拥有正确类型时直接调用setDocs(ArrayList<Document>)。 - Guillaume

2
不行,这是由于Java中泛型的实现方式所导致的。
因为在运行时类型信息不可用,所以无法通过“instanceof”进行检查。
你可以将其强制转换为“List”,然后检查每个元素是否为“Document”。

但是我知道,如果它是ArrayList类型,那么它将是ArrayList<Document>。编译器在下一行给我警告,因为我要将其转换为ArrayList<Document>。 - padre
你能做的最好的事情就是抑制这个警告。并重新思考一下,是否真的需要使用这个 instanceof 怪物。在大多数程序中,类型应该在编译时就已经确定,而不需要进行动态检查。 - Thilo
是的,我知道,但这段代码非常老,使用Java 1.4编译,所以我正在尝试将其更新到Java 1.7,并想要清理一些基本的警告信息。无论如何,谢谢。 - padre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接