【问题标题】:cast object to ArrayList<String>将对象转换为 ArrayList<String>
【发布时间】:2013-10-16 15:35:26
【问题描述】:

是否可以将Object 转换为例如ArrayList&lt;String&gt;

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

setDocs((ArrayList<Document>)obj);

我想将Object obj 转换为ArrayList&lt;String&gt;

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);

    }

【问题讨论】:

  • 有什么问题?您遇到了什么错误?
  • 你这么说,想将对象obj 转换为ArrayList&lt;String&gt;,但在最后一行你似乎转换为ArrayList&lt;Document&gt;
  • 我写了例如ArrayList,但是你是对的,类型应该是Document
  • 请注意,会有很多“else if”而不是 else{ if(){}else{} } 就像你用 python 或其他关心缩进和线。我不认为实际结果会有所不同。

标签: java casting arraylist


【解决方案1】:

在 Java 中,泛型没有具体化,即在强制转换时不使用它们的泛型类型。

所以这段代码

setDocs((ArrayList<Document>)obj);

将被执行为

setDocs((ArrayList)obj);

由于运行时转换不会检查您的 ArrayList 是否包含 Document 对象,因此编译器会发出警告。

【讨论】:

  • 我明白了......所以任何建议如何重新编写方法?我是否也应该将方法设为通用方法,然后才能工作?
  • 只要你必须投你就会有问题。当您有正确的类型时,您可以忽略编译器警告或直接调用 setDocs(ArrayList)。
【解决方案2】:

不,这是不可能的,因为泛型在 Java 中是如何实现的。

类型信息在运行时不可用,所以instanceof无法检查。

您可以做的是转换为List,然后检查每个元素是否为Document

【讨论】:

  • 但我知道,如果它来自 ArrayList 类型,那么它将是 ArrayList。编译器在下一行给我警告,我在那里转换为 ArrayList
  • 你能做的最好的就是抑制警告。并重新考虑你是否真的需要这个 instanceof 怪物。在大多数程序中,类型应该在编译时就知道了,不需要这种动态检查。
  • 是的,我知道,但是代码很旧并且可以使用 Java 1.4 编译,所以我正在尝试将其更新到 Java 1.7 并想清理一些像这样的基本警告。感谢任何方式
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 2012-08-31
  • 2018-03-27
相关资源
最近更新 更多